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