This is an automated email from the ASF dual-hosted git repository. btellier pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/james-project.git
commit 0cb0904629d6deb1fd3e3240f4abca1879ebc092 Author: duc91 <[email protected]> AuthorDate: Tue May 26 14:52:23 2020 +0700 JAMES-3093 Move authenticator to JMAP common module --- .../james/jmap/draft/DraftMethodsModule.java | 19 +++++++++++++ .../apache/james/jmap/draft/JMAPCommonModule.java | 22 --------------- .../james/jmap/rfc8621/RFC8621MethodsModule.java | 14 ++++++++++ .../james/jmap/http/AuthenticationRoutes.java | 3 ++- .../org/apache/james/jmap/http/DownloadRoutes.java | 3 ++- .../org/apache/james/jmap/http/InjectionKeys.java} | 31 +++------------------- .../org/apache/james/jmap/http/JMAPApiRoutes.java | 3 ++- .../org/apache/james/jmap/http/UploadRoutes.java | 3 ++- .../apache/james/jmap/http/AuthenticatorTest.java | 8 ++++++ .../james/jmap/http/rfc8621/InjectionKeys.java} | 31 +++------------------- .../org/apache/james/jmap/http/Authenticator.java | 5 +--- 11 files changed, 56 insertions(+), 86 deletions(-) diff --git a/server/container/guice/protocols/jmap/src/main/java/org/apache/james/jmap/draft/DraftMethodsModule.java b/server/container/guice/protocols/jmap/src/main/java/org/apache/james/jmap/draft/DraftMethodsModule.java index f63684c..18edfe4 100644 --- a/server/container/guice/protocols/jmap/src/main/java/org/apache/james/jmap/draft/DraftMethodsModule.java +++ b/server/container/guice/protocols/jmap/src/main/java/org/apache/james/jmap/draft/DraftMethodsModule.java @@ -43,10 +43,18 @@ import org.apache.james.jmap.draft.methods.SetMessagesMethod; import org.apache.james.jmap.draft.methods.SetMessagesProcessor; import org.apache.james.jmap.draft.methods.SetMessagesUpdateProcessor; import org.apache.james.jmap.draft.methods.SetVacationResponseMethod; +import org.apache.james.jmap.http.AccessTokenAuthenticationStrategy; +import org.apache.james.jmap.http.Authenticator; +import org.apache.james.jmap.http.InjectionKeys; +import org.apache.james.jmap.http.JWTAuthenticationStrategy; +import org.apache.james.jmap.http.QueryParameterAccessTokenAuthenticationStrategy; +import org.apache.james.metrics.api.MetricFactory; import com.google.inject.AbstractModule; +import com.google.inject.Provides; import com.google.inject.Scopes; import com.google.inject.multibindings.Multibinder; +import com.google.inject.name.Named; import com.google.inject.name.Names; public class DraftMethodsModule extends AbstractModule { @@ -87,4 +95,15 @@ public class DraftMethodsModule extends AbstractModule { setMessagesProcessors.addBinding().to(SendMDNProcessor.class); } + @Provides + @Named(InjectionKeys.DRAFT) + Authenticator provideAuthenticator(MetricFactory metricFactory, + AccessTokenAuthenticationStrategy accessTokenAuthenticationStrategy, + JWTAuthenticationStrategy jwtAuthenticationStrategy, + QueryParameterAccessTokenAuthenticationStrategy queryParameterAuthenticationStrategy) { + return Authenticator.of(metricFactory, + accessTokenAuthenticationStrategy, + jwtAuthenticationStrategy, + queryParameterAuthenticationStrategy); + } } diff --git a/server/container/guice/protocols/jmap/src/main/java/org/apache/james/jmap/draft/JMAPCommonModule.java b/server/container/guice/protocols/jmap/src/main/java/org/apache/james/jmap/draft/JMAPCommonModule.java index 242ae57..58b0545 100644 --- a/server/container/guice/protocols/jmap/src/main/java/org/apache/james/jmap/draft/JMAPCommonModule.java +++ b/server/container/guice/protocols/jmap/src/main/java/org/apache/james/jmap/draft/JMAPCommonModule.java @@ -18,11 +18,8 @@ ****************************************************************/ package org.apache.james.jmap.draft; -import java.util.List; import java.util.concurrent.TimeUnit; -import javax.inject.Singleton; - import org.apache.james.jmap.api.access.AccessTokenRepository; import org.apache.james.jmap.draft.api.AccessTokenManager; import org.apache.james.jmap.draft.api.SimpleTokenFactory; @@ -40,10 +37,6 @@ import org.apache.james.jmap.draft.model.message.view.MessageHeaderViewFactory; import org.apache.james.jmap.draft.model.message.view.MessageMetadataViewFactory; import org.apache.james.jmap.draft.send.MailSpool; import org.apache.james.jmap.event.ComputeMessageFastViewProjectionListener; -import org.apache.james.jmap.http.AccessTokenAuthenticationStrategy; -import org.apache.james.jmap.http.AuthenticationStrategy; -import org.apache.james.jmap.http.JWTAuthenticationStrategy; -import org.apache.james.jmap.http.QueryParameterAccessTokenAuthenticationStrategy; import org.apache.james.lifecycle.api.StartUpCheck; import org.apache.james.mailbox.events.MailboxListener; import org.apache.james.util.date.DefaultZonedDateTimeProvider; @@ -52,9 +45,7 @@ import org.apache.james.util.mime.MessageContentExtractor; import org.apache.james.utils.InitializationOperation; import org.apache.james.utils.InitilizationOperationBuilder; -import com.google.common.collect.ImmutableList; import com.google.inject.AbstractModule; -import com.google.inject.Provides; import com.google.inject.Scopes; import com.google.inject.multibindings.Multibinder; import com.google.inject.multibindings.ProvidesIntoSet; @@ -97,19 +88,6 @@ public class JMAPCommonModule extends AbstractModule { .addBinding().to(JMAPConfigurationStartUpCheck.class); } - @Provides - @Singleton - public List<AuthenticationStrategy> authStrategies( - AccessTokenAuthenticationStrategy accessTokenAuthenticationStrategy, - JWTAuthenticationStrategy jwtAuthenticationStrategy, - QueryParameterAccessTokenAuthenticationStrategy queryParameterAuthenticationStrategy) { - - return ImmutableList.of( - jwtAuthenticationStrategy, - accessTokenAuthenticationStrategy, - queryParameterAuthenticationStrategy); - } - @ProvidesIntoSet InitializationOperation workQueue(MailSpool instance) { return InitilizationOperationBuilder diff --git a/server/container/guice/protocols/jmap/src/main/java/org/apache/james/jmap/rfc8621/RFC8621MethodsModule.java b/server/container/guice/protocols/jmap/src/main/java/org/apache/james/jmap/rfc8621/RFC8621MethodsModule.java index 2ee2c37..adffa45 100644 --- a/server/container/guice/protocols/jmap/src/main/java/org/apache/james/jmap/rfc8621/RFC8621MethodsModule.java +++ b/server/container/guice/protocols/jmap/src/main/java/org/apache/james/jmap/rfc8621/RFC8621MethodsModule.java @@ -22,15 +22,22 @@ package org.apache.james.jmap.rfc8621; import org.apache.james.jmap.JMAPRoutesHandler; import org.apache.james.jmap.Version; +import org.apache.james.jmap.http.Authenticator; +import org.apache.james.jmap.http.BasicAuthenticationStrategy; +import org.apache.james.jmap.http.rfc8621.InjectionKeys; import org.apache.james.jmap.json.Serializer; import org.apache.james.jmap.method.CoreEcho; import org.apache.james.jmap.method.Method; import org.apache.james.jmap.routes.JMAPApiRoutes; +import org.apache.james.metrics.api.MetricFactory; import com.google.inject.AbstractModule; +import com.google.inject.Provides; import com.google.inject.Scopes; +import com.google.inject.Singleton; import com.google.inject.multibindings.Multibinder; import com.google.inject.multibindings.ProvidesIntoSet; +import com.google.inject.name.Named; public class RFC8621MethodsModule extends AbstractModule { @@ -46,4 +53,11 @@ public class RFC8621MethodsModule extends AbstractModule { JMAPRoutesHandler routesHandler(JMAPApiRoutes jmapApiRoutes) { return new JMAPRoutesHandler(Version.RFC8621, jmapApiRoutes); } + + @Provides + @Singleton + @Named(InjectionKeys.RFC_8621) + Authenticator provideAuthenticator(MetricFactory metricFactory, BasicAuthenticationStrategy basicAuthenticationStrategy) { + return Authenticator.of(metricFactory, basicAuthenticationStrategy); + } } diff --git a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/http/AuthenticationRoutes.java b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/http/AuthenticationRoutes.java index a968480..7b4a2c9 100644 --- a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/http/AuthenticationRoutes.java +++ b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/http/AuthenticationRoutes.java @@ -40,6 +40,7 @@ import java.util.Objects; import java.util.stream.Stream; import javax.inject.Inject; +import javax.inject.Named; import org.apache.james.core.Username; import org.apache.james.jmap.Endpoint; @@ -86,7 +87,7 @@ public class AuthenticationRoutes implements JMAPRoutes { private final Authenticator authenticator; @Inject - public AuthenticationRoutes(UsersRepository usersRepository, SimpleTokenManager simpleTokenManager, AccessTokenManager accessTokenManager, SimpleTokenFactory simpleTokenFactory, MetricFactory metricFactory, Authenticator authenticator) { + public AuthenticationRoutes(UsersRepository usersRepository, SimpleTokenManager simpleTokenManager, AccessTokenManager accessTokenManager, SimpleTokenFactory simpleTokenFactory, MetricFactory metricFactory, @Named(InjectionKeys.DRAFT) Authenticator authenticator) { this.mapper = new MultipleObjectMapperBuilder() .registerClass(ContinuationTokenRequest.UNIQUE_JSON_PATH, ContinuationTokenRequest.class) .registerClass(AccessTokenRequest.UNIQUE_JSON_PATH, AccessTokenRequest.class) diff --git a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/http/DownloadRoutes.java b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/http/DownloadRoutes.java index 7eb041a..4291758 100644 --- a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/http/DownloadRoutes.java +++ b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/http/DownloadRoutes.java @@ -36,6 +36,7 @@ import java.util.Optional; import java.util.stream.Stream; import javax.inject.Inject; +import javax.inject.Named; import org.apache.james.jmap.Endpoint; import org.apache.james.jmap.JMAPRoute; @@ -86,7 +87,7 @@ public class DownloadRoutes implements JMAPRoutes { @Inject @VisibleForTesting - DownloadRoutes(BlobManager blobManager, SimpleTokenFactory simpleTokenFactory, MetricFactory metricFactory, Authenticator authenticator) { + DownloadRoutes(BlobManager blobManager, SimpleTokenFactory simpleTokenFactory, MetricFactory metricFactory, @Named(InjectionKeys.DRAFT) Authenticator authenticator) { this.blobManager = blobManager; this.simpleTokenFactory = simpleTokenFactory; this.metricFactory = metricFactory; diff --git a/server/container/guice/protocols/jmap/src/main/java/org/apache/james/jmap/rfc8621/RFC8621MethodsModule.java b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/http/InjectionKeys.java similarity index 55% copy from server/container/guice/protocols/jmap/src/main/java/org/apache/james/jmap/rfc8621/RFC8621MethodsModule.java copy to server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/http/InjectionKeys.java index 2ee2c37..5d2ae11 100644 --- a/server/container/guice/protocols/jmap/src/main/java/org/apache/james/jmap/rfc8621/RFC8621MethodsModule.java +++ b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/http/InjectionKeys.java @@ -17,33 +17,8 @@ * under the License. * ****************************************************************/ -package org.apache.james.jmap.rfc8621; +package org.apache.james.jmap.http; - -import org.apache.james.jmap.JMAPRoutesHandler; -import org.apache.james.jmap.Version; -import org.apache.james.jmap.json.Serializer; -import org.apache.james.jmap.method.CoreEcho; -import org.apache.james.jmap.method.Method; -import org.apache.james.jmap.routes.JMAPApiRoutes; - -import com.google.inject.AbstractModule; -import com.google.inject.Scopes; -import com.google.inject.multibindings.Multibinder; -import com.google.inject.multibindings.ProvidesIntoSet; - -public class RFC8621MethodsModule extends AbstractModule { - - @Override - protected void configure() { - bind(Serializer.class).in(Scopes.SINGLETON); - - Multibinder<Method> methods = Multibinder.newSetBinder(binder(), Method.class); - methods.addBinding().to(CoreEcho.class); - } - - @ProvidesIntoSet - JMAPRoutesHandler routesHandler(JMAPApiRoutes jmapApiRoutes) { - return new JMAPRoutesHandler(Version.RFC8621, jmapApiRoutes); - } +public interface InjectionKeys { + String DRAFT = "DRAFT"; } diff --git a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/http/JMAPApiRoutes.java b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/http/JMAPApiRoutes.java index deea975..f723f5d 100644 --- a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/http/JMAPApiRoutes.java +++ b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/http/JMAPApiRoutes.java @@ -30,6 +30,7 @@ import java.io.IOException; import java.util.stream.Stream; import javax.inject.Inject; +import javax.inject.Named; import org.apache.james.jmap.Endpoint; import org.apache.james.jmap.JMAPRoute; @@ -69,7 +70,7 @@ public class JMAPApiRoutes implements JMAPRoutes { private final DefaultMailboxesProvisioner defaultMailboxesProvisioner; @Inject - public JMAPApiRoutes(RequestHandler requestHandler, MetricFactory metricFactory, Authenticator authenticator, UserProvisioner userProvisioner, DefaultMailboxesProvisioner defaultMailboxesProvisioner) { + public JMAPApiRoutes(RequestHandler requestHandler, MetricFactory metricFactory, @Named(InjectionKeys.DRAFT) Authenticator authenticator, UserProvisioner userProvisioner, DefaultMailboxesProvisioner defaultMailboxesProvisioner) { this.requestHandler = requestHandler; this.metricFactory = metricFactory; this.authenticator = authenticator; diff --git a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/http/UploadRoutes.java b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/http/UploadRoutes.java index cc530b0..918ef92 100644 --- a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/http/UploadRoutes.java +++ b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/http/UploadRoutes.java @@ -33,6 +33,7 @@ import java.io.InputStream; import java.util.stream.Stream; import javax.inject.Inject; +import javax.inject.Named; import org.apache.james.jmap.Endpoint; import org.apache.james.jmap.JMAPRoute; @@ -72,7 +73,7 @@ public class UploadRoutes implements JMAPRoutes { private final ObjectMapper objectMapper; @Inject - private UploadRoutes(MetricFactory metricFactory, Authenticator authenticator, AttachmentManager attachmentManager, ObjectMapper objectMapper) { + private UploadRoutes(MetricFactory metricFactory, @Named(InjectionKeys.DRAFT) Authenticator authenticator, AttachmentManager attachmentManager, ObjectMapper objectMapper) { this.metricFactory = metricFactory; this.authenticator = authenticator; this.attachmentManager = attachmentManager; diff --git a/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/http/AuthenticatorTest.java b/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/http/AuthenticatorTest.java index 0d614ed..59c3816 100644 --- a/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/http/AuthenticatorTest.java +++ b/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/http/AuthenticatorTest.java @@ -84,6 +84,14 @@ public class AuthenticatorTest { } @Test + public void filterShouldReturnUnauthorizedWhenNoAuthenticationStrategy() { + Authenticator testee = Authenticator.of(new RecordingMetricFactory()); + + assertThatThrownBy(() -> testee.authenticate(mockedRequest).block()) + .isInstanceOf(UnauthorizedException.class); + } + + @Test public void authenticationStrategiesShouldNotBeEagerlySubScribed() { AtomicBoolean called = new AtomicBoolean(false); diff --git a/server/container/guice/protocols/jmap/src/main/java/org/apache/james/jmap/rfc8621/RFC8621MethodsModule.java b/server/protocols/jmap-rfc-8621/src/main/java/org/apache/james/jmap/http/rfc8621/InjectionKeys.java similarity index 55% copy from server/container/guice/protocols/jmap/src/main/java/org/apache/james/jmap/rfc8621/RFC8621MethodsModule.java copy to server/protocols/jmap-rfc-8621/src/main/java/org/apache/james/jmap/http/rfc8621/InjectionKeys.java index 2ee2c37..5d62d47 100644 --- a/server/container/guice/protocols/jmap/src/main/java/org/apache/james/jmap/rfc8621/RFC8621MethodsModule.java +++ b/server/protocols/jmap-rfc-8621/src/main/java/org/apache/james/jmap/http/rfc8621/InjectionKeys.java @@ -17,33 +17,8 @@ * under the License. * ****************************************************************/ -package org.apache.james.jmap.rfc8621; +package org.apache.james.jmap.http.rfc8621; - -import org.apache.james.jmap.JMAPRoutesHandler; -import org.apache.james.jmap.Version; -import org.apache.james.jmap.json.Serializer; -import org.apache.james.jmap.method.CoreEcho; -import org.apache.james.jmap.method.Method; -import org.apache.james.jmap.routes.JMAPApiRoutes; - -import com.google.inject.AbstractModule; -import com.google.inject.Scopes; -import com.google.inject.multibindings.Multibinder; -import com.google.inject.multibindings.ProvidesIntoSet; - -public class RFC8621MethodsModule extends AbstractModule { - - @Override - protected void configure() { - bind(Serializer.class).in(Scopes.SINGLETON); - - Multibinder<Method> methods = Multibinder.newSetBinder(binder(), Method.class); - methods.addBinding().to(CoreEcho.class); - } - - @ProvidesIntoSet - JMAPRoutesHandler routesHandler(JMAPApiRoutes jmapApiRoutes) { - return new JMAPRoutesHandler(Version.RFC8621, jmapApiRoutes); - } +public interface InjectionKeys { + String RFC_8621 = "RFC-8621"; } diff --git a/server/protocols/jmap/src/main/java/org/apache/james/jmap/http/Authenticator.java b/server/protocols/jmap/src/main/java/org/apache/james/jmap/http/Authenticator.java index 6f9bc98..e3b47ad 100644 --- a/server/protocols/jmap/src/main/java/org/apache/james/jmap/http/Authenticator.java +++ b/server/protocols/jmap/src/main/java/org/apache/james/jmap/http/Authenticator.java @@ -20,8 +20,6 @@ package org.apache.james.jmap.http; import java.util.List; -import javax.inject.Inject; - import org.apache.james.jmap.exceptions.UnauthorizedException; import org.apache.james.mailbox.MailboxSession; import org.apache.james.metrics.api.MetricFactory; @@ -38,14 +36,13 @@ import reactor.netty.http.server.HttpServerRequest; public class Authenticator { private static final Logger LOGGER = LoggerFactory.getLogger(Authenticator.class); - static Authenticator of(MetricFactory metricFactory, AuthenticationStrategy... authenticationStrategies) { + public static Authenticator of(MetricFactory metricFactory, AuthenticationStrategy... authenticationStrategies) { return new Authenticator(ImmutableList.copyOf(authenticationStrategies), metricFactory); } private final List<AuthenticationStrategy> authMethods; private final MetricFactory metricFactory; - @Inject @VisibleForTesting Authenticator(List<AuthenticationStrategy> authMethods, MetricFactory metricFactory) { this.authMethods = authMethods; --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
