You are viewing a plain text version of this content. The canonical link for it is here.
Posted to server-dev@james.apache.org by bt...@apache.org on 2020/05/29 03:03:14 UTC
[james-project] 07/08: JAMES-3093 Move authenticator to JMAP common
module
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 <du...@gmail.com>
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: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org