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
commit 264f73da547e952c7eba942494acbbb0dcd50dbf Author: Rémi Kowalski <[email protected]> AuthorDate: Wed Sep 23 15:52:34 2020 +0200 JAMES-3387 require accountId to be one of the accounts of the authenticated user and validate it for mailbox/set --- .../contract/MailboxSetMethodContract.scala | 47 ++++++++++++++++++++++ .../org/apache/james/jmap/mail/MailboxSet.scala | 4 +- .../apache/james/jmap/method/CoreEchoMethod.scala | 1 + .../apache/james/jmap/method/EmailGetMethod.scala | 6 ++- .../james/jmap/method/EmailQueryMethod.scala | 4 +- .../james/jmap/method/MailboxGetMethod.scala | 4 +- .../james/jmap/method/MailboxQueryMethod.scala | 4 +- .../james/jmap/method/MailboxSetMethod.scala | 22 +++++----- .../org/apache/james/jmap/method/Method.scala | 40 +++++++++++++++++- .../jmap/method/VacationResponseGetMethod.scala | 1 + .../jmap/method/VacationResponseSetMethod.scala | 1 + .../apache/james/jmap/routes/JMAPApiRoutes.scala | 10 +++-- .../james/jmap/method/CoreEchoMethodTest.scala | 3 +- .../james/jmap/routes/JMAPApiRoutesTest.scala | 10 ++--- 14 files changed, 127 insertions(+), 30 deletions(-) diff --git a/server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/scala/org/apache/james/jmap/rfc8621/contract/MailboxSetMethodContract.scala b/server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/scala/org/apache/james/jmap/rfc8621/contract/MailboxSetMethodContract.scala index 4434d3f..106194c 100644 --- a/server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/scala/org/apache/james/jmap/rfc8621/contract/MailboxSetMethodContract.scala +++ b/server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/scala/org/apache/james/jmap/rfc8621/contract/MailboxSetMethodContract.scala @@ -62,6 +62,53 @@ trait MailboxSetMethodContract { def errorInvalidMailboxIdMessage(value: String): String @Test + def mailboxSetShouldFailWhenWrongAccountId(server: GuiceJamesServer): Unit = { + val request = + """ + |{ + | "using": [ "urn:ietf:params:jmap:core", "urn:ietf:params:jmap:mail" ], + | "methodCalls": [ + | [ + | "Mailbox/set", + | { + | "accountId": "unknownAccountId", + | "create": { + | "C42": { + | "name": "myMailbox" + | } + | } + | }, + | "c1" + | ] + | ] + |} + |""".stripMargin + + val response = `given` + .header(ACCEPT.toString, ACCEPT_RFC8621_VERSION_HEADER) + .body(request) + .when + .post + .`then` + .log().ifValidationFails() + .statusCode(SC_OK) + .contentType(JSON) + .extract + .body + .asString + + assertThatJson(response).isEqualTo( + """{ + | "sessionState": "75128aab4b1b", + | "methodResponses": [ + | ["error", { + | "type": "accountNotFound" + | }, "c1"] + | ] + |}""".stripMargin) + } + + @Test def updateShouldFailWhenModifyingRole(server: GuiceJamesServer): Unit = { val mailboxId: MailboxId = server.getProbe(classOf[MailboxProbeImpl]) .createMailbox(MailboxPath.forUser(BOB, "INBOX")) diff --git a/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/mail/MailboxSet.scala b/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/mail/MailboxSet.scala index 7cf5355..cbd034e 100644 --- a/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/mail/MailboxSet.scala +++ b/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/mail/MailboxSet.scala @@ -30,7 +30,7 @@ import org.apache.james.jmap.json.MailboxSerializer import org.apache.james.jmap.mail.MailboxName.MailboxName import org.apache.james.jmap.mail.MailboxPatchObject.MailboxPatchObjectKey import org.apache.james.jmap.mail.MailboxSetRequest.{MailboxCreationId, UnparsedMailboxId, UnparsedMailboxIdConstraint} -import org.apache.james.jmap.method.MailboxCreationParseException +import org.apache.james.jmap.method.{MailboxCreationParseException, WithAccountId} import org.apache.james.jmap.model.CapabilityIdentifier.CapabilityIdentifier import org.apache.james.jmap.model.SetError.{SetErrorDescription, SetErrorType} import org.apache.james.jmap.model.State.State @@ -45,7 +45,7 @@ case class MailboxSetRequest(accountId: AccountId, create: Option[Map[MailboxCreationId, JsObject]], update: Option[Map[UnparsedMailboxId, MailboxPatchObject]], destroy: Option[Seq[UnparsedMailboxId]], - onDestroyRemoveEmails: Option[RemoveEmailsOnDestroy]) + onDestroyRemoveEmails: Option[RemoveEmailsOnDestroy]) extends WithAccountId object MailboxSetRequest { type UnparsedMailboxIdConstraint = NonEmpty diff --git a/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/method/CoreEchoMethod.scala b/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/method/CoreEchoMethod.scala index a7fd705..c956a81 100644 --- a/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/method/CoreEchoMethod.scala +++ b/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/method/CoreEchoMethod.scala @@ -20,6 +20,7 @@ package org.apache.james.jmap.method import eu.timepit.refined.auto._ +import org.apache.james.jmap.http.SessionSupplier import org.apache.james.jmap.model.CapabilityIdentifier.CapabilityIdentifier import org.apache.james.jmap.model.DefaultCapabilities.CORE_CAPABILITY import org.apache.james.jmap.model.Invocation.MethodName diff --git a/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/method/EmailGetMethod.scala b/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/method/EmailGetMethod.scala index 361a49f..ecc4663 100644 --- a/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/method/EmailGetMethod.scala +++ b/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/method/EmailGetMethod.scala @@ -24,6 +24,7 @@ import eu.timepit.refined.auto._ import eu.timepit.refined.types.string.NonEmptyString import javax.inject.Inject import org.apache.james.jmap.api.model.Preview +import org.apache.james.jmap.http.SessionSupplier import org.apache.james.jmap.json.{EmailGetSerializer, ResponseSerializer} import org.apache.james.jmap.mail.Email.UnparsedEmailId import org.apache.james.jmap.mail.{Email, EmailBodyPart, EmailGetRequest, EmailGetResponse, EmailIds, EmailNotFound, EmailView, EmailViewReaderFactory, SpecificHeaderRequest} @@ -82,11 +83,12 @@ class EmailGetMethod @Inject() (readerFactory: EmailViewReaderFactory, messageIdFactory: MessageId.Factory, zoneIdProvider: ZoneIdProvider, previewFactory: Preview.Factory, - metricFactory: MetricFactory) extends Method { + metricFactory: MetricFactory, + sessionSupplier: SessionSupplier) extends Method { override val methodName = MethodName("Email/get") override val requiredCapabilities: Capabilities = Capabilities(CORE_CAPABILITY, MAIL_CAPABILITY) - override def process(capabilities: Set[CapabilityIdentifier], invocation: Invocation, mailboxSession: MailboxSession, processingContext: ProcessingContext): Publisher[(Invocation, ProcessingContext)] = + override def process(capabilities: Set[CapabilityIdentifier], invocation: Invocation, mailboxSession: MailboxSession, processingContext: ProcessingContext, sessionSupplier: SessionSupplier): Publisher[(Invocation, ProcessingContext)] = metricFactory.decoratePublisherWithTimerMetricLogP99(JMAP_RFC8621_PREFIX + methodName.value, asEmailGetRequest(invocation.arguments) .flatMap(computeResponseInvocation(_, invocation, mailboxSession)) diff --git a/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/method/EmailQueryMethod.scala b/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/method/EmailQueryMethod.scala index 4feb97e..0cf6810 100644 --- a/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/method/EmailQueryMethod.scala +++ b/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/method/EmailQueryMethod.scala @@ -21,6 +21,7 @@ package org.apache.james.jmap.method import cats.implicits._ import eu.timepit.refined.auto._ import javax.inject.Inject +import org.apache.james.jmap.http.SessionSupplier import org.apache.james.jmap.json.{EmailQuerySerializer, ResponseSerializer} import org.apache.james.jmap.mail.{Comparator, EmailQueryRequest, EmailQueryResponse, UnsupportedFilterException, UnsupportedRequestParameterException, UnsupportedSortException} import org.apache.james.jmap.model.CapabilityIdentifier.CapabilityIdentifier @@ -44,7 +45,8 @@ import scala.jdk.CollectionConverters._ class EmailQueryMethod @Inject() (serializer: EmailQuerySerializer, mailboxManager: MailboxManager, - metricFactory: MetricFactory) extends Method { + metricFactory: MetricFactory, + sessionSupplier: SessionSupplier) extends Method { override val methodName: MethodName = MethodName("Email/query") override val requiredCapabilities: Capabilities = Capabilities(CORE_CAPABILITY, MAIL_CAPABILITY) diff --git a/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/method/MailboxGetMethod.scala b/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/method/MailboxGetMethod.scala index e1a6a57..6e660c8 100644 --- a/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/method/MailboxGetMethod.scala +++ b/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/method/MailboxGetMethod.scala @@ -21,6 +21,7 @@ package org.apache.james.jmap.method import eu.timepit.refined.auto._ import javax.inject.Inject +import org.apache.james.jmap.http.SessionSupplier import org.apache.james.jmap.json.{MailboxSerializer, ResponseSerializer} import org.apache.james.jmap.mail.MailboxSetRequest.UnparsedMailboxId import org.apache.james.jmap.mail._ @@ -49,7 +50,8 @@ class MailboxGetMethod @Inject() (serializer: MailboxSerializer, quotaFactory : QuotaLoaderWithPreloadedDefaultFactory, mailboxIdFactory: MailboxId.Factory, mailboxFactory: MailboxFactory, - metricFactory: MetricFactory) extends Method { + metricFactory: MetricFactory, + val sessionSupplier: SessionSupplier) extends Method { override val methodName: MethodName = MethodName("Mailbox/get") override val requiredCapabilities: Capabilities = Capabilities(CORE_CAPABILITY, MAIL_CAPABILITY) diff --git a/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/method/MailboxQueryMethod.scala b/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/method/MailboxQueryMethod.scala index 46e9417..268dc1d 100644 --- a/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/method/MailboxQueryMethod.scala +++ b/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/method/MailboxQueryMethod.scala @@ -20,6 +20,7 @@ package org.apache.james.jmap.method import eu.timepit.refined.auto._ import javax.inject.Inject +import org.apache.james.jmap.http.SessionSupplier import org.apache.james.jmap.json.{MailboxQuerySerializer, ResponseSerializer} import org.apache.james.jmap.mail.{MailboxQueryRequest, MailboxQueryResponse} import org.apache.james.jmap.model.CapabilityIdentifier.CapabilityIdentifier @@ -35,7 +36,8 @@ import reactor.core.scala.publisher.{SFlux, SMono} import reactor.core.scheduler.Schedulers class MailboxQueryMethod @Inject()(systemMailboxesProvider: SystemMailboxesProvider, - metricFactory: MetricFactory) extends Method { + metricFactory: MetricFactory, + val sessionSupplier: SessionSupplier) extends Method { override val methodName = MethodName("Mailbox/query") override val requiredCapabilities: Capabilities = Capabilities(CORE_CAPABILITY, MAIL_CAPABILITY) diff --git a/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/method/MailboxSetMethod.scala b/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/method/MailboxSetMethod.scala index 465b22c..dc772c5 100644 --- a/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/method/MailboxSetMethod.scala +++ b/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/method/MailboxSetMethod.scala @@ -21,6 +21,7 @@ package org.apache.james.jmap.method import eu.timepit.refined.auto._ import javax.inject.Inject +import org.apache.james.jmap.http.SessionSupplier import org.apache.james.jmap.json.{MailboxSerializer, ResponseSerializer} import org.apache.james.jmap.mail.MailboxSetRequest.{MailboxCreationId, UnparsedMailboxId} import org.apache.james.jmap.mail.{InvalidPatchException, InvalidPropertyException, InvalidUpdateException, IsSubscribed, MailboxCreationRequest, MailboxCreationResponse, MailboxPatchObject, MailboxRights, MailboxSetError, MailboxSetRequest, MailboxSetResponse, MailboxUpdateResponse, NameUpdate, ParentIdUpdate, RemoveEmailsOnDestroy, ServerSetPropertyException, SortOrder, TotalEmails, TotalThreads, UnreadEmails, UnreadThreads, UnsupportedPropertyUpdatedException, ValidatedMailboxPatchObject} @@ -147,21 +148,18 @@ class MailboxSetMethod @Inject()(serializer: MailboxSerializer, subscriptionManager: SubscriptionManager, mailboxIdFactory: MailboxId.Factory, quotaFactory : QuotaLoaderWithPreloadedDefaultFactory, - metricFactory: MetricFactory) extends Method { + val metricFactory: MetricFactory, + val sessionSupplier: SessionSupplier) extends MethodRequiringAccountId[MailboxSetRequest] { override val methodName: MethodName = MethodName("Mailbox/set") override val requiredCapabilities: Capabilities = Capabilities(CORE_CAPABILITY, MAIL_CAPABILITY) - override def process(capabilities: Set[CapabilityIdentifier], invocation: Invocation, mailboxSession: MailboxSession, processingContext: ProcessingContext): Publisher[(Invocation, ProcessingContext)] = { - metricFactory.decoratePublisherWithTimerMetricLogP99(JMAP_RFC8621_PREFIX + methodName.value, - asMailboxSetRequest(invocation.arguments) - .flatMap(mailboxSetRequest => { - for { - creationResultsWithUpdatedProcessingContext <- createMailboxes(mailboxSession, mailboxSetRequest, processingContext) - deletionResults <- deleteMailboxes(mailboxSession, mailboxSetRequest, processingContext) - updateResults <- updateMailboxes(mailboxSession, mailboxSetRequest, processingContext, capabilities) - } yield (createResponse(capabilities, invocation, mailboxSetRequest, creationResultsWithUpdatedProcessingContext._1, deletionResults, updateResults), creationResultsWithUpdatedProcessingContext._2) - })) - } + override def doProcess(capabilities: Set[CapabilityIdentifier], invocation: Invocation, mailboxSession: MailboxSession, processingContext: ProcessingContext, request: MailboxSetRequest): SMono[(Invocation, ProcessingContext)] = for { + creationResultsWithUpdatedProcessingContext <- createMailboxes(mailboxSession, request, processingContext) + deletionResults <- deleteMailboxes(mailboxSession, request, processingContext) + updateResults <- updateMailboxes(mailboxSession, request, processingContext, capabilities) + } yield (createResponse(capabilities, invocation, request, creationResultsWithUpdatedProcessingContext._1, deletionResults, updateResults), creationResultsWithUpdatedProcessingContext._2) + + override def getRequest(mailboxSession: MailboxSession, invocation: Invocation): SMono[MailboxSetRequest] = asMailboxSetRequest(invocation.arguments) private def updateMailboxes(mailboxSession: MailboxSession, mailboxSetRequest: MailboxSetRequest, diff --git a/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/method/Method.scala b/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/method/Method.scala index e6dde8c..f4a40a5 100644 --- a/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/method/Method.scala +++ b/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/method/Method.scala @@ -19,12 +19,16 @@ package org.apache.james.jmap.method +import org.apache.james.jmap.http.SessionSupplier import org.apache.james.jmap.model.CapabilityIdentifier.CapabilityIdentifier import org.apache.james.jmap.model.Invocation.MethodName -import org.apache.james.jmap.model.{Capabilities, Invocation} +import org.apache.james.jmap.model.{AccountId, Capabilities, ErrorCode, Invocation, Session} import org.apache.james.jmap.routes.ProcessingContext import org.apache.james.mailbox.MailboxSession +import org.apache.james.mailbox.exception.MailboxNotFoundException +import org.apache.james.metrics.api.MetricFactory import org.reactivestreams.Publisher +import reactor.core.scala.publisher.SMono trait Method { val JMAP_RFC8621_PREFIX: String = "JMAP-RFC8621-" @@ -36,3 +40,37 @@ trait Method { def process(capabilities: Set[CapabilityIdentifier], invocation: Invocation, mailboxSession: MailboxSession, processingContext: ProcessingContext): Publisher[(Invocation, ProcessingContext)] } +trait WithAccountId { + def accountId: AccountId +} +trait MethodRequiringAccountId[REQUEST <: WithAccountId] extends Method { + def metricFactory: MetricFactory + def sessionSupplier: SessionSupplier + + override def process(capabilities: Set[CapabilityIdentifier], invocation: Invocation, mailboxSession: MailboxSession, processingContext: ProcessingContext): Publisher[(Invocation, ProcessingContext)] = { + val result = (for { + request <- getRequest(mailboxSession, invocation) + response <- validateAccountId(request.accountId, mailboxSession, sessionSupplier, invocation).flatMap{ + case Right(_) => doProcess(capabilities, invocation, mailboxSession, processingContext, request) + case Left(invocation) => SMono.just((invocation, processingContext)) + } + } yield response) + .onErrorResume { + case e: IllegalArgumentException => SMono.just((Invocation.error(ErrorCode.InvalidArguments, e.getMessage, invocation.methodCallId), processingContext)) + case e: Throwable => SMono.raiseError(e) + } + + metricFactory.decoratePublisherWithTimerMetricLogP99(JMAP_RFC8621_PREFIX + methodName.value, result) + } + + private def validateAccountId(accountId: AccountId, mailboxSession: MailboxSession, sessionSupplier: SessionSupplier, invocation: Invocation): SMono[Either[Invocation, Session]] = { + sessionSupplier.generate(mailboxSession.getUser) + .filter(session => session.accounts.map(_.accountId).contains(accountId)) + .map(session => Right[Invocation, Session](session).asInstanceOf[Either[Invocation, Session]]) + .switchIfEmpty(SMono.just(Left[Invocation, Session](Invocation.error(ErrorCode.AccountNotFound, invocation.methodCallId)))) + } + + def doProcess(capabilities: Set[CapabilityIdentifier], invocation: Invocation, mailboxSession: MailboxSession, processingContext: ProcessingContext, request: REQUEST): SMono[(Invocation, ProcessingContext)] + + def getRequest(mailboxSession: MailboxSession, invocation: Invocation): SMono[REQUEST] +} diff --git a/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/method/VacationResponseGetMethod.scala b/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/method/VacationResponseGetMethod.scala index 4652add..a3c3e8b 100644 --- a/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/method/VacationResponseGetMethod.scala +++ b/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/method/VacationResponseGetMethod.scala @@ -22,6 +22,7 @@ package org.apache.james.jmap.method import eu.timepit.refined.auto._ import javax.inject.Inject import org.apache.james.jmap.api.vacation.{VacationRepository, AccountId => JavaAccountId} +import org.apache.james.jmap.http.SessionSupplier import org.apache.james.jmap.json.{ResponseSerializer, VacationSerializer} import org.apache.james.jmap.mail.VacationResponse.UnparsedVacationResponseId import org.apache.james.jmap.mail.{VacationResponse, VacationResponseGetRequest, VacationResponseGetResponse, VacationResponseNotFound} diff --git a/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/method/VacationResponseSetMethod.scala b/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/method/VacationResponseSetMethod.scala index bd34d88..4b24625 100644 --- a/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/method/VacationResponseSetMethod.scala +++ b/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/method/VacationResponseSetMethod.scala @@ -22,6 +22,7 @@ package org.apache.james.jmap.method import eu.timepit.refined.auto._ import javax.inject.Inject import org.apache.james.jmap.api.vacation.{AccountId, VacationPatch, VacationRepository} +import org.apache.james.jmap.http.SessionSupplier import org.apache.james.jmap.json.{ResponseSerializer, VacationSerializer} import org.apache.james.jmap.method.VacationResponseSetMethod.VACATION_RESPONSE_PATCH_OBJECT_KEY import org.apache.james.jmap.model.CapabilityIdentifier.CapabilityIdentifier 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 6833db8..ab870e1 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 @@ -33,7 +33,7 @@ import org.apache.james.jmap.HttpConstants.JSON_CONTENT_TYPE import org.apache.james.jmap.JMAPUrls.JMAP import org.apache.james.jmap.exceptions.UnauthorizedException import org.apache.james.jmap.http.rfc8621.InjectionKeys -import org.apache.james.jmap.http.{Authenticator, MailboxesProvisioner, UserProvisioning} +import org.apache.james.jmap.http.{Authenticator, MailboxesProvisioner, SessionSupplier, UserProvisioning} import org.apache.james.jmap.json.ResponseSerializer import org.apache.james.jmap.method.Method import org.apache.james.jmap.model.CapabilityIdentifier.CapabilityIdentifier @@ -58,7 +58,8 @@ object JMAPApiRoutes { class JMAPApiRoutes (val authenticator: Authenticator, userProvisioner: UserProvisioning, mailboxesProvisioner: MailboxesProvisioner, - methods: Set[Method]) extends JMAPRoutes { + methods: Set[Method], + sessionSupplier: SessionSupplier) extends JMAPRoutes { private val methodsByName: Map[MethodName, Method] = methods.map(method => method.methodName -> method).toMap @@ -66,8 +67,9 @@ class JMAPApiRoutes (val authenticator: Authenticator, def this(@Named(InjectionKeys.RFC_8621) authenticator: Authenticator, userProvisioner: UserProvisioning, mailboxesProvisioner: MailboxesProvisioner, - javaMethods: java.util.Set[Method]) { - this(authenticator, userProvisioner, mailboxesProvisioner, javaMethods.asScala.toSet) + javaMethods: java.util.Set[Method], + sessionSupplier: SessionSupplier) { + this(authenticator, userProvisioner, mailboxesProvisioner, javaMethods.asScala.toSet, sessionSupplier) } override def routes(): stream.Stream[JMAPRoute] = Stream.of( diff --git a/server/protocols/jmap-rfc-8621/src/test/scala/org/apache/james/jmap/method/CoreEchoMethodTest.scala b/server/protocols/jmap-rfc-8621/src/test/scala/org/apache/james/jmap/method/CoreEchoMethodTest.scala index ff24174..77da9e6 100644 --- a/server/protocols/jmap-rfc-8621/src/test/scala/org/apache/james/jmap/method/CoreEchoMethodTest.scala +++ b/server/protocols/jmap-rfc-8621/src/test/scala/org/apache/james/jmap/method/CoreEchoMethodTest.scala @@ -18,9 +18,10 @@ * ***************************************************************/ package org.apache.james.jmap.method +import org.apache.james.jmap.http.SessionSupplier import org.apache.james.jmap.json.Fixture.{invocation1, invocation2} import org.apache.james.jmap.model.CapabilityIdentifier.CapabilityIdentifier -import org.apache.james.jmap.model.{CapabilityIdentifier, Invocation} +import org.apache.james.jmap.model.{CapabilityIdentifier, Invocation, JmapRfc8621Configuration} import org.apache.james.jmap.routes.ProcessingContext import org.apache.james.mailbox.MailboxSession import org.mockito.Mockito.mock diff --git a/server/protocols/jmap-rfc-8621/src/test/scala/org/apache/james/jmap/routes/JMAPApiRoutesTest.scala b/server/protocols/jmap-rfc-8621/src/test/scala/org/apache/james/jmap/routes/JMAPApiRoutesTest.scala index 069c3d6..7e5298f 100644 --- a/server/protocols/jmap-rfc-8621/src/test/scala/org/apache/james/jmap/routes/JMAPApiRoutesTest.scala +++ b/server/protocols/jmap-rfc-8621/src/test/scala/org/apache/james/jmap/routes/JMAPApiRoutesTest.scala @@ -36,12 +36,12 @@ import org.apache.james.dnsservice.api.DNSService import org.apache.james.domainlist.memory.MemoryDomainList import org.apache.james.jmap.JMAPUrls.JMAP import org.apache.james.jmap._ -import org.apache.james.jmap.http.{Authenticator, BasicAuthenticationStrategy, MailboxesProvisioner, UserProvisioning} +import org.apache.james.jmap.http.{Authenticator, BasicAuthenticationStrategy, MailboxesProvisioner, SessionSupplier, UserProvisioning} import org.apache.james.jmap.method.{CoreEchoMethod, Method} import org.apache.james.jmap.model.CapabilityIdentifier.CapabilityIdentifier import org.apache.james.jmap.model.DefaultCapabilities.CORE_CAPABILITY import org.apache.james.jmap.model.Invocation.MethodName -import org.apache.james.jmap.model.{Capabilities, RequestLevelErrorType} +import org.apache.james.jmap.model.{Capabilities, JmapRfc8621Configuration, RequestLevelErrorType} import org.apache.james.jmap.routes.JMAPApiRoutesTest._ import org.apache.james.mailbox.extension.PreDeletionHook import org.apache.james.mailbox.inmemory.{InMemoryMailboxManager, MemoryMailboxManagerProvider} @@ -76,10 +76,10 @@ object JMAPApiRoutesTest { private val userProvisionner: UserProvisioning = new UserProvisioning(usersRepository, new RecordingMetricFactory) private val subscriptionManager: StoreSubscriptionManager = new StoreSubscriptionManager(mailboxManager.getMapperFactory) private val mailboxesProvisioner: MailboxesProvisioner = new MailboxesProvisioner(mailboxManager, subscriptionManager, new RecordingMetricFactory) - + private val sessionSupplier: SessionSupplier = new SessionSupplier(JmapRfc8621Configuration(JmapRfc8621Configuration.LOCALHOST_URL_PREFIX)) private val JMAP_METHODS: Set[Method] = Set(new CoreEchoMethod) - private val JMAP_API_ROUTE: JMAPApiRoutes = new JMAPApiRoutes(AUTHENTICATOR, userProvisionner, mailboxesProvisioner, JMAP_METHODS) + private val JMAP_API_ROUTE: JMAPApiRoutes = new JMAPApiRoutes(AUTHENTICATOR, userProvisionner, mailboxesProvisioner, JMAP_METHODS, sessionSupplier) private val ROUTES_HANDLER: ImmutableSet[JMAPRoutesHandler] = ImmutableSet.of(new JMAPRoutesHandler(Version.RFC8621, JMAP_API_ROUTE)) private val userBase64String: String = Base64.getEncoder.encodeToString("user1:password".getBytes(StandardCharsets.UTF_8)) @@ -443,7 +443,7 @@ class JMAPApiRoutesTest extends AnyFlatSpec with BeforeAndAfter with Matchers { when(mockCoreEchoMethod.requiredCapabilities).thenReturn(Capabilities(CORE_CAPABILITY)) val methods: Set[Method] = Set(mockCoreEchoMethod) - val apiRoute: JMAPApiRoutes = new JMAPApiRoutes(AUTHENTICATOR, userProvisionner, mailboxesProvisioner, methods) + val apiRoute: JMAPApiRoutes = new JMAPApiRoutes(AUTHENTICATOR, userProvisionner, mailboxesProvisioner, methods, sessionSupplier) val routesHandler: ImmutableSet[JMAPRoutesHandler] = ImmutableSet.of(new JMAPRoutesHandler(Version.RFC8621, apiRoute)) val versionParser: VersionParser = new VersionParser(SUPPORTED_VERSIONS) --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
