You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@james.apache.org by bt...@apache.org on 2020/10/09 10:42:18 UTC

[james-project] branch master updated (ad72940 -> 0148ce3)

This is an automated email from the ASF dual-hosted git repository.

btellier pushed a change to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git.


    from ad72940  JAMES-3399 Allow JSON logging with logback
     new bdfc7ac  JAMES-3405 Expose metrics over HTTP
     new 6bcdd22  JAMES-3405 Metrics HTTP endpoint should be opt-in
     new 4b35308  JAMES-3416 ElasticSearch address indexing fixes
     new 5e56c75  JAMES-1677 Upgrade default user password hashing algorithms
     new 0148ce3  JAMES-3420 Avoid logging user password upon webadmin user creation

The 5 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 CHANGELOG.md                                       |  3 +
 .../destination/conf/usersrepository.xml           |  2 +-
 .../cassandra/destination/conf/usersrepository.xml |  2 +-
 .../guice/jpa/destination/conf/usersrepository.xml |  2 +-
 .../memory/destination/conf/usersrepository.xml    |  2 +-
 .../spring/destination/conf/usersrepository.xml    |  2 +-
 .../james/mailbox/elasticsearch/json/EMailer.java  |  7 +-
 .../elasticsearch/json/HeaderCollection.java       |  3 +-
 .../ElasticSearchIntegrationTest.java              | 33 ++++++++
 .../mailbox/elasticsearch/json/EMailersTest.java   | 10 ++-
 .../elasticsearch/json/HeaderCollectionTest.java   | 53 ++++++-------
 mailbox/store/src/test/resources/eml/htmlMail.json |  2 +-
 .../store/src/test/resources/eml/nonTextual.json   |  2 +-
 .../src/test/resources/eml/pgpSignedMail.json      |  2 +-
 .../src/test/resources/eml/recursiveMail.json      |  2 +-
 .../eml/recursiveMailWithoutAttachments.json       |  2 +-
 mailbox/store/src/test/resources/eml/spamMail.json |  2 +-
 .../dropwizard/DropWizardMetricFactory.java        |  1 +
 pom.xml                                            |  5 ++
 server/app/src/main/resources/usersrepository.xml  |  2 +-
 .../modules/server/DropWizardMetricsModule.java    |  2 +-
 .../james/modules/server/DataRoutesModules.java    |  4 +
 server/container/guice/protocols/webadmin/pom.xml  |  5 ++
 .../james/modules/server/WebAdminServerModule.java |  3 +
 .../james/user/cassandra/CassandraUsersDAO.java    |  2 +-
 .../org/apache/james/user/jpa/JPAUsersDAO.java     |  2 +-
 .../apache/james/user/memory/MemoryUsersDAO.java   |  4 +-
 .../contract/EmailQueryMethodContract.scala        | 77 ++-----------------
 .../rabbitmq/RabbitMQAuthorizedEndpointsTest.java  | 12 ++-
 .../RabbitMQWebAdminServerIntegrationTest.java     | 12 ++-
 ...EndpointsTest.java => DisabledMetricsTest.java} | 30 +++++++-
 .../memory/MemoryAuthorizedEndpointsTest.java      | 12 ++-
 .../MemoryWebAdminServerIntegrationTest.java       | 12 ++-
 .../integration/AuthorizedEndpointsTest.java       |  8 ++
 .../integration/WebAdminServerIntegrationTest.java | 43 +++++++++++
 server/protocols/webadmin/pom.xml                  |  1 +
 .../org/apache/james/webadmin/WebAdminServer.java  | 11 ++-
 .../james/webadmin/mdc/LoggingRequestFilter.java   | 65 ++++++++++++----
 .../apache/james/webadmin/mdc/RequestLogger.java   | 11 ++-
 .../org/apache/james/webadmin/WebAdminUtils.java   |  3 +-
 .../routes/UserCreationRequestLogger.java}         | 40 +++++-----
 .../pom.xml                                        | 49 +++++-------
 .../james/webadmin/dropwizard/MetricsRoutes.java   | 89 ++++++++++++++++++++++
 .../webadmin/dropwizard/MetricsRoutesTest.java}    | 54 ++++++++-----
 44 files changed, 457 insertions(+), 233 deletions(-)
 copy server/protocols/webadmin-integration-test/memory-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/memory/{MemoryAuthorizedEndpointsTest.java => DisabledMetricsTest.java} (69%)
 copy mailet/api/src/main/java/org/apache/mailet/Experimental.java => server/protocols/webadmin/webadmin-core/src/main/java/org/apache/james/webadmin/mdc/RequestLogger.java (86%)
 copy server/protocols/webadmin/{webadmin-core/src/main/java/org/apache/james/webadmin/mdc/LoggingResponseFilter.java => webadmin-data/src/main/java/org/apache/james/webadmin/routes/UserCreationRequestLogger.java} (63%)
 copy server/protocols/webadmin/{webadmin-cassandra => webadmin-dropwizard-metrics}/pom.xml (72%)
 create mode 100644 server/protocols/webadmin/webadmin-dropwizard-metrics/src/main/java/org/apache/james/webadmin/dropwizard/MetricsRoutes.java
 copy server/protocols/{webadmin-integration-test/webadmin-integration-test-common/src/main/java/org/apache/james/webadmin/integration/AuthorizedEndpointsTest.java => webadmin/webadmin-dropwizard-metrics/src/test/java/org/apache/james/webadmin/dropwizard/MetricsRoutesTest.java} (53%)


---------------------------------------------------------------------
To unsubscribe, e-mail: notifications-unsubscribe@james.apache.org
For additional commands, e-mail: notifications-help@james.apache.org


[james-project] 03/05: JAMES-3416 ElasticSearch address indexing fixes

Posted by bt...@apache.org.
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 4b35308eae4ac772f824e2a762564d44f393e5d1
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Thu Oct 8 08:58:36 2020 +0700

    JAMES-3416 ElasticSearch address indexing fixes
    
    bob@domain.tld was matching with alice@domain.tld
---
 CHANGELOG.md                                       |  1 +
 .../james/mailbox/elasticsearch/json/EMailer.java  |  7 +-
 .../elasticsearch/json/HeaderCollection.java       |  3 +-
 .../ElasticSearchIntegrationTest.java              | 33 ++++++++++
 .../mailbox/elasticsearch/json/EMailersTest.java   | 10 +--
 .../elasticsearch/json/HeaderCollectionTest.java   | 53 +++++++--------
 mailbox/store/src/test/resources/eml/htmlMail.json |  2 +-
 .../store/src/test/resources/eml/nonTextual.json   |  2 +-
 .../src/test/resources/eml/pgpSignedMail.json      |  2 +-
 .../src/test/resources/eml/recursiveMail.json      |  2 +-
 .../eml/recursiveMailWithoutAttachments.json       |  2 +-
 mailbox/store/src/test/resources/eml/spamMail.json |  2 +-
 .../contract/EmailQueryMethodContract.scala        | 77 ++--------------------
 13 files changed, 78 insertions(+), 118 deletions(-)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index 72e2314..7f87ace 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -34,6 +34,7 @@ Use BlobStore cache instead.
 ### Fixed
 - JAMES-3305 Avoid crashes upon deserialization issues when consuming RabbitMQ messages, leverage dead-letter feature
 - JAMES-3212 JMAP Handle subcrible/unsubcrible child's folder when update mailbox
+- JAMES-3416 Fix ElasticSearch email address search
 
 ### Removed
  - HybridBlobStore. This will be removed after 3.6.0 release. Introduced to fasten small blob access, its usage could be
diff --git a/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/json/EMailer.java b/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/json/EMailer.java
index e0a8d86..1860a69 100644
--- a/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/json/EMailer.java
+++ b/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/json/EMailer.java
@@ -20,6 +20,7 @@
 package org.apache.james.mailbox.elasticsearch.json;
 
 import java.util.Objects;
+import java.util.Optional;
 
 import com.fasterxml.jackson.annotation.JsonProperty;
 import com.google.common.base.Joiner;
@@ -27,16 +28,16 @@ import com.google.common.base.MoreObjects;
 
 public class EMailer implements SerializableMessage {
 
-    private final String name;
+    private final Optional<String> name;
     private final String address;
 
-    public EMailer(String name, String address) {
+    public EMailer(Optional<String> name, String address) {
         this.name = name;
         this.address = address;
     }
 
     @JsonProperty(JsonMessageConstants.EMailer.NAME)
-    public String getName() {
+    public Optional<String> getName() {
         return name;
     }
 
diff --git a/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/json/HeaderCollection.java b/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/json/HeaderCollection.java
index ffadfa0..0f4ca17 100644
--- a/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/json/HeaderCollection.java
+++ b/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/json/HeaderCollection.java
@@ -27,7 +27,6 @@ import java.util.Optional;
 import java.util.Set;
 import java.util.stream.Stream;
 
-import org.apache.james.mailbox.store.search.SearchUtil;
 import org.apache.james.mailbox.store.search.comparator.SentDateComparator;
 import org.apache.james.mime4j.dom.address.Address;
 import org.apache.james.mime4j.dom.address.Group;
@@ -155,7 +154,7 @@ public class HeaderCollection {
                 .parseAddressList(rawHeaderValue)
                 .stream()
                 .flatMap(this::convertAddressToMailboxStream)
-                .map((mailbox) -> new EMailer(SearchUtil.getDisplayAddress(mailbox), mailbox.getAddress()))
+                .map((mailbox) -> new EMailer(Optional.ofNullable(mailbox.getName()), mailbox.getAddress()))
                 .forEach(addressSet::add);
         }
 
diff --git a/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/ElasticSearchIntegrationTest.java b/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/ElasticSearchIntegrationTest.java
index ed1e22a..043a3dc 100644
--- a/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/ElasticSearchIntegrationTest.java
+++ b/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/ElasticSearchIntegrationTest.java
@@ -49,6 +49,7 @@ import org.apache.james.mailbox.tika.TikaHttpClientImpl;
 import org.apache.james.mailbox.tika.TikaTextExtractor;
 import org.apache.james.metrics.tests.RecordingMetricFactory;
 import org.apache.james.mime4j.dom.Message;
+import org.apache.james.mime4j.stream.RawField;
 import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.RegisterExtension;
@@ -259,4 +260,36 @@ class ElasticSearchIntegrationTest extends AbstractMessageSearchIndexTest {
         assertThat(messageManager.search(SearchQuery.of(SearchQuery.all()), session))
             .contains(customStringHeaderMessageId.getUid());
     }
+
+    @Test
+    void addressMatchesShouldBeExact() throws Exception {
+        // results should not include the domain part nor the local part but the full email address
+        MailboxPath mailboxPath = MailboxPath.forUser(USERNAME, INBOX);
+        MailboxSession session = MailboxSessionUtil.create(USERNAME);
+        MessageManager messageManager = storeMailboxManager.getMailbox(mailboxPath, session);
+
+        Message.Builder messageBuilder = Message.Builder
+            .of()
+            .setSubject("test")
+            .setBody("testmail", StandardCharsets.UTF_8);
+
+        ComposedMessageId messageId1 = messageManager.appendMessage(
+            MessageManager.AppendCommand.builder().build(
+                messageBuilder
+                    .addField(new RawField("To", "alice@domain.tld"))
+                    .build()),
+            session).getId();
+
+        ComposedMessageId messageId2 = messageManager.appendMessage(
+            MessageManager.AppendCommand.builder().build(
+                messageBuilder
+                    .addField(new RawField("To", "bob@other.tld"))
+                    .build()),
+            session).getId();
+
+        elasticSearch.awaitForElasticSearch();
+
+        assertThat(messageManager.search(SearchQuery.of(SearchQuery.address(SearchQuery.AddressType.To, "bob@other.tld")), session))
+            .containsOnly(messageId2.getUid());
+    }
 }
\ No newline at end of file
diff --git a/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/json/EMailersTest.java b/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/json/EMailersTest.java
index 885e3bc..31e957e 100644
--- a/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/json/EMailersTest.java
+++ b/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/json/EMailersTest.java
@@ -22,6 +22,8 @@ package org.apache.james.mailbox.elasticsearch.json;
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.assertj.core.api.Assertions.assertThatThrownBy;
 
+import java.util.Optional;
+
 import org.junit.jupiter.api.Test;
 
 import com.google.common.base.Joiner;
@@ -45,7 +47,7 @@ class EMailersTest {
 
     @Test
     void serializeShouldNotJoinWhenOneElement() {
-        EMailer emailer = new EMailer("name", "address");
+        EMailer emailer = new EMailer(Optional.of("name"), "address");
         EMailers eMailers = EMailers.from(ImmutableSet.of(emailer));
 
         assertThat(eMailers.serialize()).isEqualTo(emailer.serialize());
@@ -53,9 +55,9 @@ class EMailersTest {
 
     @Test
     void serializeShouldJoinWhenMultipleElements() {
-        EMailer emailer = new EMailer("name", "address");
-        EMailer emailer2 = new EMailer("name2", "address2");
-        EMailer emailer3 = new EMailer("name3", "address3");
+        EMailer emailer = new EMailer(Optional.of("name"), "address");
+        EMailer emailer2 = new EMailer(Optional.of("name2"), "address2");
+        EMailer emailer3 = new EMailer(Optional.of("name3"), "address3");
 
         String expected = Joiner.on(" ").join(emailer.serialize(), emailer2.serialize(), emailer3.serialize());
 
diff --git a/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/json/HeaderCollectionTest.java b/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/json/HeaderCollectionTest.java
index 250e00a..f7aec4e 100644
--- a/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/json/HeaderCollectionTest.java
+++ b/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/json/HeaderCollectionTest.java
@@ -23,6 +23,7 @@ import static org.assertj.core.api.Assertions.assertThat;
 import static org.assertj.core.api.Assertions.assertThatThrownBy;
 
 import java.time.format.DateTimeFormatter;
+import java.util.Optional;
 import java.util.stream.Stream;
 
 import org.junit.jupiter.api.Test;
@@ -55,7 +56,7 @@ class HeaderCollectionTest {
             .build();
 
         assertThat(headerCollection.getToAddressSet())
-            .containsOnly(new EMailer("ben.tellier@linagora.com", "ben.tellier@linagora.com"));
+            .containsOnly(new EMailer(Optional.empty(), "ben.tellier@linagora.com"));
     }
 
     @Test
@@ -66,8 +67,8 @@ class HeaderCollectionTest {
 
         assertThat(headerCollection.getToAddressSet())
             .containsOnly(
-                new EMailer("ben.tellier@linagora.com", "ben.tellier@linagora.com"),
-                new EMailer("btellier@minet.net", "btellier@minet.net"));
+                new EMailer(Optional.empty(), "ben.tellier@linagora.com"),
+                new EMailer(Optional.empty(), "btellier@minet.net"));
     }
 
     @Test
@@ -79,8 +80,8 @@ class HeaderCollectionTest {
 
         assertThat(headerCollection.getToAddressSet())
             .containsOnly(
-                new EMailer("ben.tellier@linagora.com", "ben.tellier@linagora.com"),
-                new EMailer("btellier@minet.net", "btellier@minet.net"));
+                new EMailer(Optional.empty(), "ben.tellier@linagora.com"),
+                new EMailer(Optional.empty(), "btellier@minet.net"));
     }
 
     @Test
@@ -90,7 +91,7 @@ class HeaderCollectionTest {
             .build();
 
         assertThat(headerCollection.getToAddressSet())
-            .containsOnly(new EMailer("Christophe Hamerling", "chri.hamerling@linagora.com"));
+            .containsOnly(new EMailer(Optional.of("Christophe Hamerling"), "chri.hamerling@linagora.com"));
     }
 
     @ParameterizedTest
@@ -102,7 +103,7 @@ class HeaderCollectionTest {
 
         assertThat(headerCollection.getFromAddressSet())
             .extracting(EMailer::getName)
-            .contains(nameOfFromAddress);
+            .contains(Optional.ofNullable(nameOfFromAddress));
     }
 
     @Test
@@ -133,8 +134,8 @@ class HeaderCollectionTest {
             .build();
 
         assertThat(headerCollection.getFromAddressSet())
-            .containsOnly(new EMailer("Christophe Hamerling", "chri.hamerling@linagora.com"),
-                new EMailer("Graham CROSMARIE", "grah.crosmarie@linagora.com"));
+            .containsOnly(new EMailer(Optional.of("Christophe Hamerling"), "chri.hamerling@linagora.com"),
+                new EMailer(Optional.of("Graham CROSMARIE"), "grah.crosmarie@linagora.com"));
     }
 
     @Test
@@ -145,8 +146,8 @@ class HeaderCollectionTest {
             .build();
 
         assertThat(headerCollection.getFromAddressSet())
-            .containsOnly(new EMailer("Christophe Hamerling", "chri.hamerling@linagora.com"),
-                new EMailer("Graham CROSMARIE", "grah.crosmarie@linagora.com"));
+            .containsOnly(new EMailer(Optional.of("Christophe Hamerling"), "chri.hamerling@linagora.com"),
+                new EMailer(Optional.of("Graham CROSMARIE"), "grah.crosmarie@linagora.com"));
     }
 
     @Test
@@ -169,8 +170,8 @@ class HeaderCollectionTest {
             .build();
 
         assertThat(headerCollection.getToAddressSet())
-            .containsOnly(new EMailer("Christophe Hamerling", "chri.hamerling@linagora.com"),
-                new EMailer("grah.crosmarie@linagora.com", "grah.crosmarie@linagora.com"));
+            .containsOnly(new EMailer(Optional.of("Christophe Hamerling"), "chri.hamerling@linagora.com"),
+                new EMailer(Optional.empty(), "grah.crosmarie@linagora.com"));
     }
 
     @Test
@@ -180,7 +181,7 @@ class HeaderCollectionTest {
             .build();
 
         assertThat(headerCollection.getCcAddressSet())
-            .containsOnly(new EMailer("Christophe Hamerling", "chri.hamerling@linagora.com"));
+            .containsOnly(new EMailer(Optional.of("Christophe Hamerling"), "chri.hamerling@linagora.com"));
     }
 
     @Test
@@ -190,7 +191,7 @@ class HeaderCollectionTest {
             .build();
 
         assertThat(headerCollection.getReplyToAddressSet())
-            .containsOnly(new EMailer("Christophe Hamerling", "chri.hamerling@linagora.com"));
+            .containsOnly(new EMailer(Optional.of("Christophe Hamerling"), "chri.hamerling@linagora.com"));
     }
 
     @Test
@@ -200,17 +201,7 @@ class HeaderCollectionTest {
             .build();
 
         assertThat(headerCollection.getBccAddressSet())
-            .containsOnly(new EMailer("Christophe Hamerling", "chri.hamerling@linagora.com"));
-    }
-
-    @Test
-    void headerContaingNoAddressShouldBeConsideredBothAsNameAndAddress() {
-        HeaderCollection headerCollection = HeaderCollection.builder()
-            .add(new FieldImpl("Bcc", "Not an address"))
-            .build();
-
-        assertThat(headerCollection.getBccAddressSet())
-            .containsOnly(new EMailer("Not an address", "Not an address"));
+            .containsOnly(new EMailer(Optional.of("Christophe Hamerling"), "chri.hamerling@linagora.com"));
     }
 
     @Test
@@ -220,7 +211,7 @@ class HeaderCollectionTest {
             .build();
 
         assertThat(headerCollection.getBccAddressSet())
-            .containsOnly(new EMailer("Mickey", "tricky@mouse.com"));
+            .containsOnly(new EMailer(Optional.of("Mickey"), "tricky@mouse.com"));
     }
 
     @Test
@@ -230,8 +221,8 @@ class HeaderCollectionTest {
             .build();
 
         assertThat(headerCollection.getBccAddressSet())
-            .containsOnly(new EMailer("Mickey", "tricky@mouse.com"),
-                new EMailer("Miny", "hello@polo.com"));
+            .containsOnly(new EMailer(Optional.of("Mickey"), "tricky@mouse.com"),
+                new EMailer(Optional.of("Miny"), "hello@polo.com"));
     }
 
     @Test
@@ -241,8 +232,8 @@ class HeaderCollectionTest {
             .build();
 
         assertThat(headerCollection.getBccAddressSet())
-            .containsOnly(new EMailer("Mickey", "tricky@mouse.com"),
-                new EMailer("Miny", "hello@polo.com"));
+            .containsOnly(new EMailer(Optional.of("Mickey"), "tricky@mouse.com"),
+                new EMailer(Optional.of("Miny"), "hello@polo.com"));
     }
 
     @Test
diff --git a/mailbox/store/src/test/resources/eml/htmlMail.json b/mailbox/store/src/test/resources/eml/htmlMail.json
index 326664b..45445d2 100644
--- a/mailbox/store/src/test/resources/eml/htmlMail.json
+++ b/mailbox/store/src/test/resources/eml/htmlMail.json
@@ -105,7 +105,7 @@
   ],
   "to":[
     {
-      "name":"mister@james.org",
+      "name":null,
       "address":"mister@james.org"
     }
   ],
diff --git a/mailbox/store/src/test/resources/eml/nonTextual.json b/mailbox/store/src/test/resources/eml/nonTextual.json
index 48d5d15..121434e 100644
--- a/mailbox/store/src/test/resources/eml/nonTextual.json
+++ b/mailbox/store/src/test/resources/eml/nonTextual.json
@@ -68,7 +68,7 @@
   "size":25,
   "subject":["Test message"],
   "subtype":"text",
-  "to":[{"name":"btellier@linagora.com","address":"btellier@linagora.com"}],
+  "to":[{"name":null,"address":"btellier@linagora.com"}],
   "uid":25,
   "userFlags":[],
   "mimeMessageID":"<55...@linagora.com>",
diff --git a/mailbox/store/src/test/resources/eml/pgpSignedMail.json b/mailbox/store/src/test/resources/eml/pgpSignedMail.json
index f5673d5..32538b7 100644
--- a/mailbox/store/src/test/resources/eml/pgpSignedMail.json
+++ b/mailbox/store/src/test/resources/eml/pgpSignedMail.json
@@ -150,7 +150,7 @@
   ],
   "to": [
 	{
-	  "name": "debian-security-announce@lists.debian.org",
+	  "name": null,
 	  "address": "debian-security-announce@lists.debian.org"
 	}
   ],
diff --git a/mailbox/store/src/test/resources/eml/recursiveMail.json b/mailbox/store/src/test/resources/eml/recursiveMail.json
index ba6edc4..e59b266 100644
--- a/mailbox/store/src/test/resources/eml/recursiveMail.json
+++ b/mailbox/store/src/test/resources/eml/recursiveMail.json
@@ -66,7 +66,7 @@
   ],
   "to": [
     {
-      "name": "btellier@linagora.com",
+      "name": null,
       "address": "btellier@linagora.com"
     }
   ],
diff --git a/mailbox/store/src/test/resources/eml/recursiveMailWithoutAttachments.json b/mailbox/store/src/test/resources/eml/recursiveMailWithoutAttachments.json
index b0f7c5d..7c0daa2 100644
--- a/mailbox/store/src/test/resources/eml/recursiveMailWithoutAttachments.json
+++ b/mailbox/store/src/test/resources/eml/recursiveMailWithoutAttachments.json
@@ -66,7 +66,7 @@
   ],
   "to": [
     {
-      "name": "btellier@linagora.com",
+      "name": null,
       "address": "btellier@linagora.com"
     }
   ],
diff --git a/mailbox/store/src/test/resources/eml/spamMail.json b/mailbox/store/src/test/resources/eml/spamMail.json
index 626881a..7216c1f 100644
--- a/mailbox/store/src/test/resources/eml/spamMail.json
+++ b/mailbox/store/src/test/resources/eml/spamMail.json
@@ -105,7 +105,7 @@
   ],
   "to": [
 	{
-	  "name": "root@listes.minet.net",
+	  "name": null,
 	  "address": "root@listes.minet.net"
 	}
   ],
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/EmailQueryMethodContract.scala b/server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/scala/org/apache/james/jmap/rfc8621/contract/EmailQueryMethodContract.scala
index 33c53b3..de4683f 100644
--- a/server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/scala/org/apache/james/jmap/rfc8621/contract/EmailQueryMethodContract.scala
+++ b/server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/scala/org/apache/james/jmap/rfc8621/contract/EmailQueryMethodContract.scala
@@ -4829,7 +4829,7 @@ trait EmailQueryMethodContract {
         .of
         .setSubject("a mail")
         .setFrom("bloblah@domain.tld")
-        .setFrom("test@domain.tld")
+        .setFrom("test@other.tld")
         .setBody("lorem ipsum", StandardCharsets.UTF_8)
         .build))
       .getMessageId
@@ -4839,7 +4839,7 @@ trait EmailQueryMethodContract {
         .of
         .setSubject("another mail")
         .setTo("bloblah@domain.tld")
-        .setTo("test@gmail.com")
+        .setTo("test@other.tld")
         .setBody("lorem ipsum", StandardCharsets.UTF_8)
         .build))
       .getMessageId
@@ -4848,7 +4848,7 @@ trait EmailQueryMethodContract {
       .appendMessage(BOB.asString, inbox(BOB), AppendCommand.from(Message.Builder
         .of
         .setSubject("another mail")
-        .addField(new RawField("Cc", "<bl...@domain.tld>, <te...@gmail.com>"))
+        .addField(new RawField("Cc", "<bl...@domain.tld>, <te...@other.tld>"))
         .setBody("lorem ipsum", StandardCharsets.UTF_8)
         .build))
       .getMessageId
@@ -4857,15 +4857,7 @@ trait EmailQueryMethodContract {
       .appendMessage(BOB.asString, inbox(BOB), AppendCommand.from(Message.Builder
         .of
         .setSubject("another mail")
-        .addField(new RawField("Bcc", "<bl...@domain.tld>, <te...@gmail.com>"))
-        .setBody("lorem ipsum", StandardCharsets.UTF_8)
-        .build))
-      .getMessageId
-
-    val messageId5: MessageId = mailboxProbe
-      .appendMessage(BOB.asString, inbox(BOB), AppendCommand.from(Message.Builder
-        .of
-        .setSubject("Subject with test word")
+        .addField(new RawField("Bcc", "<bl...@domain.tld>, <te...@other.tld>"))
         .setBody("lorem ipsum", StandardCharsets.UTF_8)
         .build))
       .getMessageId
@@ -4888,7 +4880,7 @@ trait EmailQueryMethodContract {
          |    {
          |      "accountId": "29883977c13473ae7cb7678ef767cbfbaffc8a44a6e463d971d23a65c1dc4af6",
          |      "filter": {
-         |        "text": "test"
+         |        "text": "test@other.tld"
          |      }
          |    },
          |    "c1"]]
@@ -4912,7 +4904,6 @@ trait EmailQueryMethodContract {
         .inPath("$.methodResponses[0][1].ids")
         .isEqualTo(
           s"""[
-             |  "${messageId5.serialize}",
              |  "${messageId4.serialize}",
              |  "${messageId3.serialize}",
              |  "${messageId2.serialize}",
@@ -4979,64 +4970,6 @@ trait EmailQueryMethodContract {
   }
 
   @Test
-  def textShouldMatchFromField(server: GuiceJamesServer): Unit = {
-    server.getProbe(classOf[MailboxProbeImpl]).createMailbox(inbox(BOB))
-    val messageId1: MessageId = server.getProbe(classOf[MailboxProbeImpl])
-      .appendMessage(BOB.asString, inbox(BOB), AppendCommand.from(Message.Builder
-        .of
-        .addField(new RawField("From", "toto@domain.tld"))
-        .setSubject("a mail")
-        .setBody("This is a test body", StandardCharsets.UTF_8)
-        .build))
-      .getMessageId
-
-    server.getProbe(classOf[MailboxProbeImpl])
-      .appendMessage(BOB.asString, inbox(BOB), AppendCommand.from(Message.Builder
-        .of
-        .setSubject("should not be found mail")
-        .setBody("lorem ipsum", StandardCharsets.UTF_8)
-        .build))
-      .getMessageId
-
-    val request =
-      s"""{
-         |  "using": [
-         |    "urn:ietf:params:jmap:core",
-         |    "urn:ietf:params:jmap:mail"],
-         |  "methodCalls": [[
-         |    "Email/query",
-         |    {
-         |      "accountId": "29883977c13473ae7cb7678ef767cbfbaffc8a44a6e463d971d23a65c1dc4af6",
-         |      "filter": {
-         |        "text": "toto@domain.tld"
-         |      }
-         |    },
-         |    "c1"]]
-         |}""".stripMargin
-
-    awaitAtMostTenSeconds.untilAsserted { () =>
-      val response = `given`
-        .header(ACCEPT.toString, ACCEPT_RFC8621_VERSION_HEADER)
-        .body(request)
-      .when
-        .post
-      .`then`
-        .statusCode(SC_OK)
-        .contentType(JSON)
-        .extract
-        .body
-        .asString
-
-      assertThatJson(response)
-        .inPath("$.methodResponses[0][1].ids")
-        .isEqualTo(
-          s"""[
-             |  "${messageId1.serialize}"
-             |]""".stripMargin)
-    }
-  }
-
-  @Test
   def emailQueryShouldSupportTextFilterForHtmlBody(server: GuiceJamesServer): Unit = {
     server.getProbe(classOf[MailboxProbeImpl]).createMailbox(inbox(BOB))
     val messageId1: MessageId = server.getProbe(classOf[MailboxProbeImpl])


---------------------------------------------------------------------
To unsubscribe, e-mail: notifications-unsubscribe@james.apache.org
For additional commands, e-mail: notifications-help@james.apache.org


[james-project] 02/05: JAMES-3405 Metrics HTTP endpoint should be opt-in

Posted by bt...@apache.org.
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 6bcdd22d066cbed175c654cd5e7b44625818a7ae
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Thu Oct 8 14:29:49 2020 +0700

    JAMES-3405 Metrics HTTP endpoint should be opt-in
---
 .../james/modules/server/MetricsRoutesModule.java  | 38 ----------------------
 .../james/modules/server/WebAdminServerModule.java |  1 -
 .../rabbitmq/RabbitMQAuthorizedEndpointsTest.java  | 12 ++++++-
 .../RabbitMQWebAdminServerIntegrationTest.java     | 12 ++++++-
 ...EndpointsTest.java => DisabledMetricsTest.java} | 30 +++++++++++++++--
 .../memory/MemoryAuthorizedEndpointsTest.java      | 12 ++++++-
 .../MemoryWebAdminServerIntegrationTest.java       | 12 ++++++-
 7 files changed, 72 insertions(+), 45 deletions(-)

diff --git a/server/container/guice/protocols/webadmin/src/main/java/org/apache/james/modules/server/MetricsRoutesModule.java b/server/container/guice/protocols/webadmin/src/main/java/org/apache/james/modules/server/MetricsRoutesModule.java
deleted file mode 100644
index 1429b23..0000000
--- a/server/container/guice/protocols/webadmin/src/main/java/org/apache/james/modules/server/MetricsRoutesModule.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/****************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one   *
- * or more contributor license agreements.  See the NOTICE file *
- * distributed with this work for additional information        *
- * regarding copyright ownership.  The ASF licenses this file   *
- * to you under the Apache License, Version 2.0 (the            *
- * "License"); you may not use this file except in compliance   *
- * with the License.  You may obtain a copy of the License at   *
- *                                                              *
- *   http://www.apache.org/licenses/LICENSE-2.0                 *
- *                                                              *
- * Unless required by applicable law or agreed to in writing,   *
- * software distributed under the License is distributed on an  *
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
- * KIND, either express or implied.  See the License for the    *
- * specific language governing permissions and limitations      *
- * under the License.                                           *
- ****************************************************************/
-
-package org.apache.james.modules.server;
-
-import org.apache.james.webadmin.Routes;
-import org.apache.james.webadmin.dropwizard.MetricsRoutes;
-
-import com.google.inject.AbstractModule;
-import com.google.inject.Scopes;
-import com.google.inject.multibindings.Multibinder;
-
-public class MetricsRoutesModule extends AbstractModule {
-    @Override
-    protected void configure() {
-        bind(MetricsRoutes.class).in(Scopes.SINGLETON);
-
-        Multibinder.newSetBinder(binder(), Routes.class)
-            .addBinding()
-            .to(MetricsRoutes.class);
-    }
-}
diff --git a/server/container/guice/protocols/webadmin/src/main/java/org/apache/james/modules/server/WebAdminServerModule.java b/server/container/guice/protocols/webadmin/src/main/java/org/apache/james/modules/server/WebAdminServerModule.java
index 42fff3e..ff2f263 100644
--- a/server/container/guice/protocols/webadmin/src/main/java/org/apache/james/modules/server/WebAdminServerModule.java
+++ b/server/container/guice/protocols/webadmin/src/main/java/org/apache/james/modules/server/WebAdminServerModule.java
@@ -78,7 +78,6 @@ public class WebAdminServerModule extends AbstractModule {
     protected void configure() {
         install(new TaskRoutesModule());
         install(new HealthCheckRoutesModule());
-        install(new MetricsRoutesModule());
 
         bind(JsonTransformer.class).in(Scopes.SINGLETON);
         bind(WebAdminServer.class).in(Scopes.SINGLETON);
diff --git a/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/RabbitMQAuthorizedEndpointsTest.java b/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/RabbitMQAuthorizedEndpointsTest.java
index 31f367f..727de20 100644
--- a/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/RabbitMQAuthorizedEndpointsTest.java
+++ b/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/RabbitMQAuthorizedEndpointsTest.java
@@ -30,6 +30,8 @@ import org.apache.james.junit.categories.BasicFeature;
 import org.apache.james.modules.AwsS3BlobStoreExtension;
 import org.apache.james.modules.RabbitMQExtension;
 import org.apache.james.modules.blobstore.BlobStoreConfiguration;
+import org.apache.james.webadmin.RandomPortSupplier;
+import org.apache.james.webadmin.WebAdminConfiguration;
 import org.apache.james.webadmin.integration.AuthorizedEndpointsTest;
 import org.apache.james.webadmin.integration.UnauthorizedModule;
 import org.apache.james.webadmin.integration.WebadminIntegrationTestModule;
@@ -56,7 +58,15 @@ class RabbitMQAuthorizedEndpointsTest extends AuthorizedEndpointsTest {
         .extension(new RabbitMQExtension())
         .server(configuration -> CassandraRabbitMQJamesServerMain.createServer(configuration)
             .overrideWith(new UnauthorizedModule())
-            .overrideWith(new WebadminIntegrationTestModule()))
+            .overrideWith(new WebadminIntegrationTestModule())
+            .overrideWith(binder -> binder.bind(WebAdminConfiguration.class)
+                .toInstance(WebAdminConfiguration.builder()
+                    .enabled()
+                    .corsDisabled()
+                    .host("127.0.0.1")
+                    .port(new RandomPortSupplier())
+                    .additionalRoute("org.apache.james.webadmin.dropwizard.MetricsRoutes")
+                    .build())))
         .lifeCycle(JamesServerExtension.Lifecycle.PER_CLASS)
         .build();
 }
diff --git a/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/RabbitMQWebAdminServerIntegrationTest.java b/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/RabbitMQWebAdminServerIntegrationTest.java
index f410212..7b61442 100644
--- a/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/RabbitMQWebAdminServerIntegrationTest.java
+++ b/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/RabbitMQWebAdminServerIntegrationTest.java
@@ -41,6 +41,8 @@ import org.apache.james.junit.categories.BasicFeature;
 import org.apache.james.modules.AwsS3BlobStoreExtension;
 import org.apache.james.modules.RabbitMQExtension;
 import org.apache.james.modules.blobstore.BlobStoreConfiguration;
+import org.apache.james.webadmin.RandomPortSupplier;
+import org.apache.james.webadmin.WebAdminConfiguration;
 import org.apache.james.webadmin.integration.WebAdminServerIntegrationTest;
 import org.apache.james.webadmin.integration.WebadminIntegrationTestModule;
 import org.apache.james.webadmin.routes.AliasRoutes;
@@ -75,7 +77,15 @@ class RabbitMQWebAdminServerIntegrationTest extends WebAdminServerIntegrationTes
         .extension(new AwsS3BlobStoreExtension())
         .extension(new RabbitMQExtension())
         .server(configuration -> CassandraRabbitMQJamesServerMain.createServer(configuration)
-            .overrideWith(new WebadminIntegrationTestModule()))
+            .overrideWith(new WebadminIntegrationTestModule())
+            .overrideWith(binder -> binder.bind(WebAdminConfiguration.class)
+                .toInstance(WebAdminConfiguration.builder()
+                    .enabled()
+                    .corsDisabled()
+                    .host("127.0.0.1")
+                    .port(new RandomPortSupplier())
+                    .additionalRoute("org.apache.james.webadmin.dropwizard.MetricsRoutes")
+                    .build())))
         .build();
 
     private static final String VERSION = "/cassandra/version";
diff --git a/server/protocols/webadmin-integration-test/memory-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/memory/MemoryAuthorizedEndpointsTest.java b/server/protocols/webadmin-integration-test/memory-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/memory/DisabledMetricsTest.java
similarity index 69%
copy from server/protocols/webadmin-integration-test/memory-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/memory/MemoryAuthorizedEndpointsTest.java
copy to server/protocols/webadmin-integration-test/memory-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/memory/DisabledMetricsTest.java
index 8ab6edd..e85e100 100644
--- a/server/protocols/webadmin-integration-test/memory-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/memory/MemoryAuthorizedEndpointsTest.java
+++ b/server/protocols/webadmin-integration-test/memory-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/memory/DisabledMetricsTest.java
@@ -19,15 +19,24 @@
 
 package org.apache.james.webadmin.integration.memory;
 
+import static io.restassured.RestAssured.when;
+
+import org.apache.james.GuiceJamesServer;
 import org.apache.james.JamesServerBuilder;
 import org.apache.james.JamesServerExtension;
 import org.apache.james.MemoryJamesServerMain;
-import org.apache.james.webadmin.integration.AuthorizedEndpointsTest;
+import org.apache.james.utils.WebAdminGuiceProbe;
+import org.apache.james.webadmin.WebAdminUtils;
 import org.apache.james.webadmin.integration.UnauthorizedModule;
 import org.apache.james.webadmin.integration.WebadminIntegrationTestModule;
+import org.eclipse.jetty.http.HttpStatus;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.RegisterExtension;
 
-class MemoryAuthorizedEndpointsTest extends AuthorizedEndpointsTest {
+import io.restassured.RestAssured;
+
+class DisabledMetricsTest {
     @RegisterExtension
     static JamesServerExtension jamesServerExtension = new JamesServerBuilder<>(JamesServerBuilder.defaultConfigurationProvider())
         .server(configuration -> MemoryJamesServerMain.createServer(configuration)
@@ -35,4 +44,21 @@ class MemoryAuthorizedEndpointsTest extends AuthorizedEndpointsTest {
             .overrideWith(new UnauthorizedModule()))
         .lifeCycle(JamesServerExtension.Lifecycle.PER_CLASS)
         .build();
+
+
+    @BeforeEach
+    void setUp(GuiceJamesServer guiceJamesServer) {
+        WebAdminGuiceProbe webAdminGuiceProbe = guiceJamesServer.getProbe(WebAdminGuiceProbe.class);
+
+        RestAssured.requestSpecification = WebAdminUtils.buildRequestSpecification(webAdminGuiceProbe.getWebAdminPort())
+            .build();
+    }
+
+    @Test
+    void getMetricsShouldReturnNotFoundWhenAdditionalRouteNotConfigured() {
+        when()
+            .get("/metrics")
+        .then()
+            .statusCode(HttpStatus.NOT_FOUND_404);
+    }
 }
\ No newline at end of file
diff --git a/server/protocols/webadmin-integration-test/memory-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/memory/MemoryAuthorizedEndpointsTest.java b/server/protocols/webadmin-integration-test/memory-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/memory/MemoryAuthorizedEndpointsTest.java
index 8ab6edd..866f104 100644
--- a/server/protocols/webadmin-integration-test/memory-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/memory/MemoryAuthorizedEndpointsTest.java
+++ b/server/protocols/webadmin-integration-test/memory-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/memory/MemoryAuthorizedEndpointsTest.java
@@ -22,6 +22,8 @@ package org.apache.james.webadmin.integration.memory;
 import org.apache.james.JamesServerBuilder;
 import org.apache.james.JamesServerExtension;
 import org.apache.james.MemoryJamesServerMain;
+import org.apache.james.webadmin.RandomPortSupplier;
+import org.apache.james.webadmin.WebAdminConfiguration;
 import org.apache.james.webadmin.integration.AuthorizedEndpointsTest;
 import org.apache.james.webadmin.integration.UnauthorizedModule;
 import org.apache.james.webadmin.integration.WebadminIntegrationTestModule;
@@ -32,7 +34,15 @@ class MemoryAuthorizedEndpointsTest extends AuthorizedEndpointsTest {
     static JamesServerExtension jamesServerExtension = new JamesServerBuilder<>(JamesServerBuilder.defaultConfigurationProvider())
         .server(configuration -> MemoryJamesServerMain.createServer(configuration)
             .overrideWith(new WebadminIntegrationTestModule())
-            .overrideWith(new UnauthorizedModule()))
+            .overrideWith(new UnauthorizedModule())
+            .overrideWith(binder -> binder.bind(WebAdminConfiguration.class)
+                .toInstance(WebAdminConfiguration.builder()
+                    .enabled()
+                    .corsDisabled()
+                    .host("127.0.0.1")
+                    .port(new RandomPortSupplier())
+                    .additionalRoute("org.apache.james.webadmin.dropwizard.MetricsRoutes")
+                    .build())))
         .lifeCycle(JamesServerExtension.Lifecycle.PER_CLASS)
         .build();
 }
\ No newline at end of file
diff --git a/server/protocols/webadmin-integration-test/memory-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/memory/MemoryWebAdminServerIntegrationTest.java b/server/protocols/webadmin-integration-test/memory-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/memory/MemoryWebAdminServerIntegrationTest.java
index 2c8a48a..68b4dfb 100644
--- a/server/protocols/webadmin-integration-test/memory-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/memory/MemoryWebAdminServerIntegrationTest.java
+++ b/server/protocols/webadmin-integration-test/memory-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/memory/MemoryWebAdminServerIntegrationTest.java
@@ -22,6 +22,8 @@ package org.apache.james.webadmin.integration.memory;
 import org.apache.james.JamesServerBuilder;
 import org.apache.james.JamesServerExtension;
 import org.apache.james.MemoryJamesServerMain;
+import org.apache.james.webadmin.RandomPortSupplier;
+import org.apache.james.webadmin.WebAdminConfiguration;
 import org.apache.james.webadmin.integration.WebAdminServerIntegrationTest;
 import org.apache.james.webadmin.integration.WebadminIntegrationTestModule;
 import org.junit.jupiter.api.extension.RegisterExtension;
@@ -31,6 +33,14 @@ class MemoryWebAdminServerIntegrationTest extends WebAdminServerIntegrationTest
     @RegisterExtension
     static JamesServerExtension jamesServerExtension = new JamesServerBuilder<>(JamesServerBuilder.defaultConfigurationProvider())
         .server(configuration -> MemoryJamesServerMain.createServer(configuration)
-            .overrideWith(new WebadminIntegrationTestModule()))
+            .overrideWith(new WebadminIntegrationTestModule())
+            .overrideWith(binder -> binder.bind(WebAdminConfiguration.class)
+                .toInstance(WebAdminConfiguration.builder()
+                    .enabled()
+                    .corsDisabled()
+                    .host("127.0.0.1")
+                    .port(new RandomPortSupplier())
+                    .additionalRoute("org.apache.james.webadmin.dropwizard.MetricsRoutes")
+                    .build())))
         .build();
 }
\ No newline at end of file


---------------------------------------------------------------------
To unsubscribe, e-mail: notifications-unsubscribe@james.apache.org
For additional commands, e-mail: notifications-help@james.apache.org


[james-project] 04/05: JAMES-1677 Upgrade default user password hashing algorithms

Posted by bt...@apache.org.
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 5e56c751d8dba80af43a3c0f3fd4ee1439563f50
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Thu Oct 8 12:48:29 2020 +0700

    JAMES-1677 Upgrade default user password hashing algorithms
    
    The change is only applied to newly created users, no impact on existing users
---
 CHANGELOG.md                                                          | 1 +
 .../run/guice/cassandra-rabbitmq/destination/conf/usersrepository.xml | 2 +-
 dockerfiles/run/guice/cassandra/destination/conf/usersrepository.xml  | 2 +-
 dockerfiles/run/guice/jpa/destination/conf/usersrepository.xml        | 2 +-
 dockerfiles/run/guice/memory/destination/conf/usersrepository.xml     | 2 +-
 dockerfiles/run/spring/destination/conf/usersrepository.xml           | 2 +-
 server/app/src/main/resources/usersrepository.xml                     | 2 +-
 .../main/java/org/apache/james/user/cassandra/CassandraUsersDAO.java  | 2 +-
 .../data-jpa/src/main/java/org/apache/james/user/jpa/JPAUsersDAO.java | 2 +-
 .../src/main/java/org/apache/james/user/memory/MemoryUsersDAO.java    | 4 ++--
 10 files changed, 11 insertions(+), 10 deletions(-)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index 7f87ace..51f48e3 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -35,6 +35,7 @@ Use BlobStore cache instead.
 - JAMES-3305 Avoid crashes upon deserialization issues when consuming RabbitMQ messages, leverage dead-letter feature
 - JAMES-3212 JMAP Handle subcrible/unsubcrible child's folder when update mailbox
 - JAMES-3416 Fix ElasticSearch email address search
+- JAMES-1677 Upgrade default hasing algorithm to SHA-512
 
 ### Removed
  - HybridBlobStore. This will be removed after 3.6.0 release. Introduced to fasten small blob access, its usage could be
diff --git a/dockerfiles/run/guice/cassandra-rabbitmq/destination/conf/usersrepository.xml b/dockerfiles/run/guice/cassandra-rabbitmq/destination/conf/usersrepository.xml
index 8b3e8e1..3a540c4 100644
--- a/dockerfiles/run/guice/cassandra-rabbitmq/destination/conf/usersrepository.xml
+++ b/dockerfiles/run/guice/cassandra-rabbitmq/destination/conf/usersrepository.xml
@@ -21,7 +21,7 @@
 <!-- Read https://james.apache.org/server/config-users.html for further details -->
 
 <usersrepository name="LocalUsers">
-    <algorithm>MD5</algorithm>
+    <algorithm>SHA-512</algorithm>
     <enableVirtualHosting>true</enableVirtualHosting>    
     <enableForwarding>true</enableForwarding>
 </usersrepository>
diff --git a/dockerfiles/run/guice/cassandra/destination/conf/usersrepository.xml b/dockerfiles/run/guice/cassandra/destination/conf/usersrepository.xml
index 8b3e8e1..3a540c4 100644
--- a/dockerfiles/run/guice/cassandra/destination/conf/usersrepository.xml
+++ b/dockerfiles/run/guice/cassandra/destination/conf/usersrepository.xml
@@ -21,7 +21,7 @@
 <!-- Read https://james.apache.org/server/config-users.html for further details -->
 
 <usersrepository name="LocalUsers">
-    <algorithm>MD5</algorithm>
+    <algorithm>SHA-512</algorithm>
     <enableVirtualHosting>true</enableVirtualHosting>    
     <enableForwarding>true</enableForwarding>
 </usersrepository>
diff --git a/dockerfiles/run/guice/jpa/destination/conf/usersrepository.xml b/dockerfiles/run/guice/jpa/destination/conf/usersrepository.xml
index 8b3e8e1..3a540c4 100644
--- a/dockerfiles/run/guice/jpa/destination/conf/usersrepository.xml
+++ b/dockerfiles/run/guice/jpa/destination/conf/usersrepository.xml
@@ -21,7 +21,7 @@
 <!-- Read https://james.apache.org/server/config-users.html for further details -->
 
 <usersrepository name="LocalUsers">
-    <algorithm>MD5</algorithm>
+    <algorithm>SHA-512</algorithm>
     <enableVirtualHosting>true</enableVirtualHosting>    
     <enableForwarding>true</enableForwarding>
 </usersrepository>
diff --git a/dockerfiles/run/guice/memory/destination/conf/usersrepository.xml b/dockerfiles/run/guice/memory/destination/conf/usersrepository.xml
index 8b3e8e1..3a540c4 100644
--- a/dockerfiles/run/guice/memory/destination/conf/usersrepository.xml
+++ b/dockerfiles/run/guice/memory/destination/conf/usersrepository.xml
@@ -21,7 +21,7 @@
 <!-- Read https://james.apache.org/server/config-users.html for further details -->
 
 <usersrepository name="LocalUsers">
-    <algorithm>MD5</algorithm>
+    <algorithm>SHA-512</algorithm>
     <enableVirtualHosting>true</enableVirtualHosting>    
     <enableForwarding>true</enableForwarding>
 </usersrepository>
diff --git a/dockerfiles/run/spring/destination/conf/usersrepository.xml b/dockerfiles/run/spring/destination/conf/usersrepository.xml
index 55f617c..a32265b 100644
--- a/dockerfiles/run/spring/destination/conf/usersrepository.xml
+++ b/dockerfiles/run/spring/destination/conf/usersrepository.xml
@@ -19,7 +19,7 @@
  -->
 
 <usersrepository name="LocalUsers" class="org.apache.james.user.jpa.JPAUsersRepository">
-    <algorithm>MD5</algorithm>
+    <algorithm>SHA-512</algorithm>
     <enableVirtualHosting>true</enableVirtualHosting>    
 </usersrepository>
 
diff --git a/server/app/src/main/resources/usersrepository.xml b/server/app/src/main/resources/usersrepository.xml
index ff34382..9552bc7 100644
--- a/server/app/src/main/resources/usersrepository.xml
+++ b/server/app/src/main/resources/usersrepository.xml
@@ -36,7 +36,7 @@
   MD5, SHA-256, SHA-512, NONE
 -->
 <usersrepository name="LocalUsers" class="org.apache.james.user.jpa.JPAUsersRepository">
-    <algorithm>MD5</algorithm>
+    <algorithm>SHA-512</algorithm>
     <enableVirtualHosting>true</enableVirtualHosting>
 
     <!-- User's name. Allow an user to access to the <a href="https://tools.ietf.org/html/rfc4616#section-2">impersonation command</a>, acting on the behalf of any user. -->
diff --git a/server/data/data-cassandra/src/main/java/org/apache/james/user/cassandra/CassandraUsersDAO.java b/server/data/data-cassandra/src/main/java/org/apache/james/user/cassandra/CassandraUsersDAO.java
index a5dddb8..25689c2 100644
--- a/server/data/data-cassandra/src/main/java/org/apache/james/user/cassandra/CassandraUsersDAO.java
+++ b/server/data/data-cassandra/src/main/java/org/apache/james/user/cassandra/CassandraUsersDAO.java
@@ -51,7 +51,7 @@ import com.google.common.base.Preconditions;
 import com.google.common.primitives.Ints;
 
 public class CassandraUsersDAO implements UsersDAO {
-    private static final String DEFAULT_ALGO_VALUE = "SHA1";
+    private static final String DEFAULT_ALGO_VALUE = "SHA-512";
 
     private final CassandraAsyncExecutor executor;
     private final PreparedStatement getUserStatement;
diff --git a/server/data/data-jpa/src/main/java/org/apache/james/user/jpa/JPAUsersDAO.java b/server/data/data-jpa/src/main/java/org/apache/james/user/jpa/JPAUsersDAO.java
index b8ba183..46e0b57 100644
--- a/server/data/data-jpa/src/main/java/org/apache/james/user/jpa/JPAUsersDAO.java
+++ b/server/data/data-jpa/src/main/java/org/apache/james/user/jpa/JPAUsersDAO.java
@@ -56,7 +56,7 @@ public class JPAUsersDAO implements UsersDAO, Configurable {
 
     @Override
     public void configure(HierarchicalConfiguration<ImmutableNode> config) {
-        algo = config.getString("algorithm", "MD5");
+        algo = config.getString("algorithm", "SHA-512");
     }
 
     /**
diff --git a/server/data/data-memory/src/main/java/org/apache/james/user/memory/MemoryUsersDAO.java b/server/data/data-memory/src/main/java/org/apache/james/user/memory/MemoryUsersDAO.java
index 7f175f4..33e07d2 100644
--- a/server/data/data-memory/src/main/java/org/apache/james/user/memory/MemoryUsersDAO.java
+++ b/server/data/data-memory/src/main/java/org/apache/james/user/memory/MemoryUsersDAO.java
@@ -39,12 +39,12 @@ public class MemoryUsersDAO implements UsersDAO, Configurable {
 
     MemoryUsersDAO() {
         this.userByName = new HashMap<>();
-        this.algo = "MD5";
+        this.algo = "SHA-512";
     }
 
     @Override
     public void configure(HierarchicalConfiguration<ImmutableNode> config) {
-        algo = config.getString("algorithm", "MD5");
+        algo = config.getString("algorithm", "SHA-512");
     }
 
     public void clear() {


---------------------------------------------------------------------
To unsubscribe, e-mail: notifications-unsubscribe@james.apache.org
For additional commands, e-mail: notifications-help@james.apache.org


[james-project] 05/05: JAMES-3420 Avoid logging user password upon webadmin user creation

Posted by bt...@apache.org.
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 0148ce3f5daadaf2d22c578174a733be9feca511
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Thu Oct 8 12:38:05 2020 +0700

    JAMES-3420 Avoid logging user password upon webadmin user creation
---
 .../james/modules/server/DataRoutesModules.java    |  4 ++
 .../james/modules/server/WebAdminServerModule.java |  3 +
 .../integration/WebAdminServerIntegrationTest.java | 30 ++++++++++
 .../org/apache/james/webadmin/WebAdminServer.java  | 11 ++--
 .../james/webadmin/mdc/LoggingRequestFilter.java   | 65 ++++++++++++++++------
 .../apache/james/webadmin/mdc/RequestLogger.java   | 28 ++++++++++
 .../org/apache/james/webadmin/WebAdminUtils.java   |  3 +-
 .../routes/UserCreationRequestLogger.java}         | 50 ++++++++---------
 8 files changed, 147 insertions(+), 47 deletions(-)

diff --git a/server/container/guice/protocols/webadmin-data/src/main/java/org/apache/james/modules/server/DataRoutesModules.java b/server/container/guice/protocols/webadmin-data/src/main/java/org/apache/james/modules/server/DataRoutesModules.java
index d198069..1014264 100644
--- a/server/container/guice/protocols/webadmin-data/src/main/java/org/apache/james/modules/server/DataRoutesModules.java
+++ b/server/container/guice/protocols/webadmin-data/src/main/java/org/apache/james/modules/server/DataRoutesModules.java
@@ -21,6 +21,7 @@ package org.apache.james.modules.server;
 
 import org.apache.james.webadmin.Routes;
 import org.apache.james.webadmin.dto.MappingSourceModule;
+import org.apache.james.webadmin.mdc.RequestLogger;
 import org.apache.james.webadmin.routes.AddressMappingRoutes;
 import org.apache.james.webadmin.routes.AliasRoutes;
 import org.apache.james.webadmin.routes.DomainMappingsRoutes;
@@ -29,6 +30,7 @@ import org.apache.james.webadmin.routes.ForwardRoutes;
 import org.apache.james.webadmin.routes.GroupsRoutes;
 import org.apache.james.webadmin.routes.MappingRoutes;
 import org.apache.james.webadmin.routes.RegexMappingRoutes;
+import org.apache.james.webadmin.routes.UserCreationRequestLogger;
 import org.apache.james.webadmin.routes.UserRoutes;
 import org.apache.james.webadmin.utils.JsonTransformerModule;
 
@@ -52,5 +54,7 @@ public class DataRoutesModules extends AbstractModule {
 
         Multibinder<JsonTransformerModule> jsonTransformerModuleMultibinder = Multibinder.newSetBinder(binder(), JsonTransformerModule.class);
         jsonTransformerModuleMultibinder.addBinding().to(MappingSourceModule.class);
+
+        Multibinder.newSetBinder(binder(), RequestLogger.class).addBinding().to(UserCreationRequestLogger.class);
     }
 }
diff --git a/server/container/guice/protocols/webadmin/src/main/java/org/apache/james/modules/server/WebAdminServerModule.java b/server/container/guice/protocols/webadmin/src/main/java/org/apache/james/modules/server/WebAdminServerModule.java
index ff2f263..a2625be 100644
--- a/server/container/guice/protocols/webadmin/src/main/java/org/apache/james/modules/server/WebAdminServerModule.java
+++ b/server/container/guice/protocols/webadmin/src/main/java/org/apache/james/modules/server/WebAdminServerModule.java
@@ -46,6 +46,7 @@ import org.apache.james.webadmin.WebAdminServer;
 import org.apache.james.webadmin.authentication.AuthenticationFilter;
 import org.apache.james.webadmin.authentication.JwtFilter;
 import org.apache.james.webadmin.authentication.NoAuthenticationFilter;
+import org.apache.james.webadmin.mdc.RequestLogger;
 import org.apache.james.webadmin.utils.JsonTransformer;
 import org.apache.james.webadmin.utils.JsonTransformerModule;
 import org.slf4j.Logger;
@@ -84,6 +85,8 @@ public class WebAdminServerModule extends AbstractModule {
 
         Multibinder.newSetBinder(binder(), GuiceProbe.class).addBinding().to(WebAdminGuiceProbe.class);
         Multibinder.newSetBinder(binder(), JsonTransformerModule.class);
+
+        Multibinder.newSetBinder(binder(), RequestLogger.class);
     }
 
     @Provides
diff --git a/server/protocols/webadmin-integration-test/webadmin-integration-test-common/src/main/java/org/apache/james/webadmin/integration/WebAdminServerIntegrationTest.java b/server/protocols/webadmin-integration-test/webadmin-integration-test-common/src/main/java/org/apache/james/webadmin/integration/WebAdminServerIntegrationTest.java
index 4d303a4..992a2e9 100644
--- a/server/protocols/webadmin-integration-test/webadmin-integration-test-common/src/main/java/org/apache/james/webadmin/integration/WebAdminServerIntegrationTest.java
+++ b/server/protocols/webadmin-integration-test/webadmin-integration-test-common/src/main/java/org/apache/james/webadmin/integration/WebAdminServerIntegrationTest.java
@@ -37,6 +37,7 @@ import org.apache.james.probe.DataProbe;
 import org.apache.james.utils.DataProbeImpl;
 import org.apache.james.utils.WebAdminGuiceProbe;
 import org.apache.james.webadmin.WebAdminUtils;
+import org.apache.james.webadmin.mdc.LoggingRequestFilter;
 import org.apache.james.webadmin.routes.AliasRoutes;
 import org.apache.james.webadmin.routes.DomainsRoutes;
 import org.apache.james.webadmin.routes.ForwardRoutes;
@@ -51,7 +52,11 @@ import org.apache.james.webadmin.swagger.routes.SwaggerRoutes;
 import org.eclipse.jetty.http.HttpStatus;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
+import org.slf4j.LoggerFactory;
 
+import ch.qos.logback.classic.Logger;
+import ch.qos.logback.classic.spi.ILoggingEvent;
+import ch.qos.logback.core.read.ListAppender;
 import io.restassured.RestAssured;
 
 public abstract class WebAdminServerIntegrationTest {
@@ -175,6 +180,19 @@ public abstract class WebAdminServerIntegrationTest {
     }
 
     @Test
+    void putShouldNotLogThePassword() {
+        ListAppender<ILoggingEvent> loggingEvents = getListAppenderForClass(LoggingRequestFilter.class);
+
+        with()
+            .body("{\"password\":\"password\"}")
+            .put(SPECIFIC_USER);
+
+        assertThat(loggingEvents.list)
+                .hasSize(1)
+                .allSatisfy(loggingEvent -> assertThat(loggingEvent.getMDCPropertyMap()).doesNotContainKey("request-body"));
+    }
+
+    @Test
     void deleteShouldRemoveTheUser() throws Exception {
         dataProbe.addUser(USERNAME, "anyPassword");
 
@@ -366,4 +384,16 @@ public abstract class WebAdminServerIntegrationTest {
             .body("status", is("completed"))
             .body("type", is("MailboxesExportTask"));
     }
+
+
+    public static ListAppender<ILoggingEvent> getListAppenderForClass(Class clazz) {
+        Logger logger = (Logger) LoggerFactory.getLogger(clazz);
+
+        ListAppender<ILoggingEvent> loggingEventListAppender = new ListAppender<>();
+        loggingEventListAppender.start();
+
+        logger.addAppender(loggingEventListAppender);
+
+        return loggingEventListAppender;
+    }
 }
\ No newline at end of file
diff --git a/server/protocols/webadmin/webadmin-core/src/main/java/org/apache/james/webadmin/WebAdminServer.java b/server/protocols/webadmin/webadmin-core/src/main/java/org/apache/james/webadmin/WebAdminServer.java
index 1c9f00a..9a13bdcc 100644
--- a/server/protocols/webadmin/webadmin-core/src/main/java/org/apache/james/webadmin/WebAdminServer.java
+++ b/server/protocols/webadmin/webadmin-core/src/main/java/org/apache/james/webadmin/WebAdminServer.java
@@ -63,17 +63,20 @@ public class WebAdminServer implements Startable {
     private final Service service;
     private final AuthenticationFilter authenticationFilter;
     private final MetricFactory metricFactory;
+    private final LoggingRequestFilter loggingRequestFilter;
 
     @Inject
     protected WebAdminServer(WebAdminConfiguration configuration,
-                          @Named("webAdminRoutes") List<Routes> routesList,
-                          AuthenticationFilter authenticationFilter,
-                          MetricFactory metricFactory) {
+                             @Named("webAdminRoutes") List<Routes> routesList,
+                             AuthenticationFilter authenticationFilter,
+                             MetricFactory metricFactory,
+                             LoggingRequestFilter loggingRequestFilter) {
         this.configuration = configuration;
         this.privateRoutes = privateRoutes(routesList);
         this.publicRoutes = publicRoutes(routesList);
         this.authenticationFilter = authenticationFilter;
         this.metricFactory = metricFactory;
+        this.loggingRequestFilter = loggingRequestFilter;
         this.service = Service.ignite();
     }
 
@@ -116,7 +119,7 @@ public class WebAdminServer implements Startable {
 
     private void configureMDC() {
         service.before(new MDCFilter());
-        service.before(new LoggingRequestFilter());
+        service.before(loggingRequestFilter);
         service.after(new LoggingResponseFilter());
         service.after(new MDCCleanupFilter());
     }
diff --git a/server/protocols/webadmin/webadmin-core/src/main/java/org/apache/james/webadmin/mdc/LoggingRequestFilter.java b/server/protocols/webadmin/webadmin-core/src/main/java/org/apache/james/webadmin/mdc/LoggingRequestFilter.java
index 32ef13e..06a7edf 100644
--- a/server/protocols/webadmin/webadmin-core/src/main/java/org/apache/james/webadmin/mdc/LoggingRequestFilter.java
+++ b/server/protocols/webadmin/webadmin-core/src/main/java/org/apache/james/webadmin/mdc/LoggingRequestFilter.java
@@ -21,6 +21,10 @@ package org.apache.james.webadmin.mdc;
 
 import static org.apache.james.webadmin.authentication.AuthenticationFilter.LOGIN;
 
+import java.util.Set;
+
+import javax.inject.Inject;
+
 import org.apache.james.util.MDCStructuredLogger;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -32,13 +36,46 @@ import spark.Request;
 import spark.Response;
 
 public class LoggingRequestFilter implements Filter {
-    private static final Logger LOGGER = LoggerFactory.getLogger(LoggingRequestFilter.class);
-    static final String REQUEST_BODY = "request-body";
-    static final String METHOD = "method";
-    static final String ENDPOINT = "endpoint";
-    static final String QUERY_PARAMETERS = "queryParameters";
-    static final String IP = "ip";
-    static final String REQUEST_ID = "requestId";
+    private static class DefaultRequestLogger implements RequestLogger {
+        private static final DefaultRequestLogger INSTANCE = new DefaultRequestLogger();
+
+        @Override
+        public boolean applies(Request request) {
+            return true;
+        }
+
+        @Override
+        public void log(Request request, RequestId requestId) {
+            MDCStructuredLogger.forLogger(LOGGER)
+                    .addField(REQUEST_ID, requestId.asString())
+                    .addField(IP, request.ip())
+                    .addField(ENDPOINT, request.url())
+                    .addField(METHOD, request.requestMethod())
+                    .addField(LOGIN, request.attribute(LOGIN))
+                    .addField(QUERY_PARAMETERS, ImmutableSet.copyOf(request.queryParams()))
+                    .addField(REQUEST_BODY, request.body())
+                    .log(logger -> logger.info("WebAdmin request received"));
+        }
+    }
+
+    public static final Logger LOGGER = LoggerFactory.getLogger(LoggingRequestFilter.class);
+    public static final String REQUEST_BODY = "request-body";
+    public static final String METHOD = "method";
+    public static final String ENDPOINT = "endpoint";
+    public static final String QUERY_PARAMETERS = "queryParameters";
+    public static final String IP = "ip";
+    public static final String REQUEST_ID = "requestId";
+
+    public static LoggingRequestFilter create() {
+        return new LoggingRequestFilter(ImmutableSet.of());
+    }
+
+    private final Set<RequestLogger> requestLoggers;
+
+    @Inject
+    public LoggingRequestFilter(Set<RequestLogger> requestLoggers) {
+        this.requestLoggers = requestLoggers;
+    }
 
     @Override
     public void handle(Request request, Response response) {
@@ -46,14 +83,10 @@ public class LoggingRequestFilter implements Filter {
 
         request.attribute(REQUEST_ID, requestId);
 
-        MDCStructuredLogger.forLogger(LOGGER)
-            .addField(REQUEST_ID, requestId.asString())
-            .addField(IP, request.ip())
-            .addField(ENDPOINT, request.url())
-            .addField(METHOD, request.requestMethod())
-            .addField(LOGIN, request.attribute(LOGIN))
-            .addField(QUERY_PARAMETERS, ImmutableSet.copyOf(request.queryParams()))
-            .addField(REQUEST_BODY, request.body())
-            .log(logger -> logger.info("WebAdmin request received"));
+        requestLoggers.stream()
+                .filter(requestLogger -> requestLogger.applies(request))
+                .findFirst()
+                .orElse(DefaultRequestLogger.INSTANCE)
+                .log(request, requestId);
     }
 }
diff --git a/server/protocols/webadmin/webadmin-core/src/main/java/org/apache/james/webadmin/mdc/RequestLogger.java b/server/protocols/webadmin/webadmin-core/src/main/java/org/apache/james/webadmin/mdc/RequestLogger.java
new file mode 100644
index 0000000..4d8ca10
--- /dev/null
+++ b/server/protocols/webadmin/webadmin-core/src/main/java/org/apache/james/webadmin/mdc/RequestLogger.java
@@ -0,0 +1,28 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one   *
+ * or more contributor license agreements.  See the NOTICE file *
+ * distributed with this work for additional information        *
+ * regarding copyright ownership.  The ASF licenses this file   *
+ * to you under the Apache License, Version 2.0 (the            *
+ * "License"); you may not use this file except in compliance   *
+ * with the License.  You may obtain a copy of the License at   *
+ *                                                              *
+ *   http://www.apache.org/licenses/LICENSE-2.0                 *
+ *                                                              *
+ * Unless required by applicable law or agreed to in writing,   *
+ * software distributed under the License is distributed on an  *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
+ * KIND, either express or implied.  See the License for the    *
+ * specific language governing permissions and limitations      *
+ * under the License.                                           *
+ ****************************************************************/
+
+package org.apache.james.webadmin.mdc;
+
+import spark.Request;
+
+public interface RequestLogger {
+    boolean applies(Request request);
+
+    void log(Request request, RequestId requestId);
+}
diff --git a/server/protocols/webadmin/webadmin-core/src/test/java/org/apache/james/webadmin/WebAdminUtils.java b/server/protocols/webadmin/webadmin-core/src/test/java/org/apache/james/webadmin/WebAdminUtils.java
index 60aeb11..f63ac3f 100644
--- a/server/protocols/webadmin/webadmin-core/src/test/java/org/apache/james/webadmin/WebAdminUtils.java
+++ b/server/protocols/webadmin/webadmin-core/src/test/java/org/apache/james/webadmin/WebAdminUtils.java
@@ -32,6 +32,7 @@ import org.apache.james.metrics.tests.RecordingMetricFactory;
 import org.apache.james.util.Port;
 import org.apache.james.webadmin.authentication.AuthenticationFilter;
 import org.apache.james.webadmin.authentication.NoAuthenticationFilter;
+import org.apache.james.webadmin.mdc.LoggingRequestFilter;
 
 import com.google.common.collect.ImmutableList;
 
@@ -45,7 +46,7 @@ import reactor.util.retry.Retry;
 public class WebAdminUtils {
     private static class ConcurrentSafeWebAdminServer extends WebAdminServer {
         ConcurrentSafeWebAdminServer(WebAdminConfiguration configuration, List<Routes> routesList, AuthenticationFilter authenticationFilter, MetricFactory metricFactory) {
-            super(configuration, routesList, authenticationFilter, metricFactory);
+            super(configuration, routesList, authenticationFilter, metricFactory, LoggingRequestFilter.create());
         }
 
         /**
diff --git a/server/protocols/webadmin/webadmin-core/src/main/java/org/apache/james/webadmin/mdc/LoggingRequestFilter.java b/server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/routes/UserCreationRequestLogger.java
similarity index 50%
copy from server/protocols/webadmin/webadmin-core/src/main/java/org/apache/james/webadmin/mdc/LoggingRequestFilter.java
copy to server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/routes/UserCreationRequestLogger.java
index 32ef13e..8bcbe5c 100644
--- a/server/protocols/webadmin/webadmin-core/src/main/java/org/apache/james/webadmin/mdc/LoggingRequestFilter.java
+++ b/server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/routes/UserCreationRequestLogger.java
@@ -17,43 +17,41 @@
  * under the License.                                           *
  ****************************************************************/
 
-package org.apache.james.webadmin.mdc;
+package org.apache.james.webadmin.routes;
 
 import static org.apache.james.webadmin.authentication.AuthenticationFilter.LOGIN;
+import static org.apache.james.webadmin.mdc.LoggingRequestFilter.ENDPOINT;
+import static org.apache.james.webadmin.mdc.LoggingRequestFilter.IP;
+import static org.apache.james.webadmin.mdc.LoggingRequestFilter.LOGGER;
+import static org.apache.james.webadmin.mdc.LoggingRequestFilter.METHOD;
+import static org.apache.james.webadmin.mdc.LoggingRequestFilter.QUERY_PARAMETERS;
+import static org.apache.james.webadmin.mdc.LoggingRequestFilter.REQUEST_ID;
 
 import org.apache.james.util.MDCStructuredLogger;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import org.apache.james.webadmin.mdc.RequestId;
+import org.apache.james.webadmin.mdc.RequestLogger;
 
 import com.google.common.collect.ImmutableSet;
 
-import spark.Filter;
 import spark.Request;
-import spark.Response;
-
-public class LoggingRequestFilter implements Filter {
-    private static final Logger LOGGER = LoggerFactory.getLogger(LoggingRequestFilter.class);
-    static final String REQUEST_BODY = "request-body";
-    static final String METHOD = "method";
-    static final String ENDPOINT = "endpoint";
-    static final String QUERY_PARAMETERS = "queryParameters";
-    static final String IP = "ip";
-    static final String REQUEST_ID = "requestId";
 
+// This class skips logging of the body for user creation requests as it contains the user password
+public class UserCreationRequestLogger implements RequestLogger {
     @Override
-    public void handle(Request request, Response response) {
-        RequestId requestId = RequestId.random();
-
-        request.attribute(REQUEST_ID, requestId);
+    public boolean applies(Request request) {
+        return request.pathInfo().startsWith(UserRoutes.USERS)
+            && request.requestMethod().equals("PUT");
+    }
 
+    @Override
+    public void log(Request request, RequestId requestId) {
         MDCStructuredLogger.forLogger(LOGGER)
-            .addField(REQUEST_ID, requestId.asString())
-            .addField(IP, request.ip())
-            .addField(ENDPOINT, request.url())
-            .addField(METHOD, request.requestMethod())
-            .addField(LOGIN, request.attribute(LOGIN))
-            .addField(QUERY_PARAMETERS, ImmutableSet.copyOf(request.queryParams()))
-            .addField(REQUEST_BODY, request.body())
-            .log(logger -> logger.info("WebAdmin request received"));
+                .addField(REQUEST_ID, requestId.asString())
+                .addField(IP, request.ip())
+                .addField(ENDPOINT, request.url())
+                .addField(METHOD, request.requestMethod())
+                .addField(LOGIN, request.attribute(LOGIN))
+                .addField(QUERY_PARAMETERS, ImmutableSet.copyOf(request.queryParams()))
+                .log(logger -> logger.info("WebAdmin request received: user creation request"));
     }
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: notifications-unsubscribe@james.apache.org
For additional commands, e-mail: notifications-help@james.apache.org


[james-project] 01/05: JAMES-3405 Expose metrics over HTTP

Posted by bt...@apache.org.
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 bdfc7acf4073047fe823f867c242f2329ee06f4f
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Tue Oct 6 14:21:50 2020 +0700

    JAMES-3405 Expose metrics over HTTP
---
 CHANGELOG.md                                       |  1 +
 .../dropwizard/DropWizardMetricFactory.java        |  1 +
 pom.xml                                            |  5 ++
 .../modules/server/DropWizardMetricsModule.java    |  2 +-
 server/container/guice/protocols/webadmin/pom.xml  |  5 ++
 .../james/modules/server/MetricsRoutesModule.java  | 38 +++++++++
 .../james/modules/server/WebAdminServerModule.java |  1 +
 .../integration/AuthorizedEndpointsTest.java       |  8 ++
 .../integration/WebAdminServerIntegrationTest.java | 13 ++++
 server/protocols/webadmin/pom.xml                  |  1 +
 .../webadmin/webadmin-dropwizard-metrics}/pom.xml  | 54 ++++++++++---
 .../james/webadmin/dropwizard/MetricsRoutes.java   | 89 ++++++++++++++++++++++
 .../webadmin/dropwizard/MetricsRoutesTest.java}    | 54 ++++++++-----
 13 files changed, 238 insertions(+), 34 deletions(-)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index 4d3e97c7..72e2314 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -13,6 +13,7 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/)
 - JAMES-3296 Webadmin endpoint to rebuild RabbitMQMailQueue in the Distributed Server
 - JAMES-3266 Offer an option to disable ElasticSearch in Distributed James product
 - JAMES-3202 Reindex only outdated documents with the Mode option set to CORRECT in reindexing tasks
+- JAMES-3405 Expose metrics of Guice servers over HTTP - enables easy Prometheus metrics collection
 
 ### Changed
 - Switch to Java 11 for build and run
diff --git a/metrics/metrics-dropwizard/src/main/java/org/apache/james/metrics/dropwizard/DropWizardMetricFactory.java b/metrics/metrics-dropwizard/src/main/java/org/apache/james/metrics/dropwizard/DropWizardMetricFactory.java
index 8a87b88..263dcee 100644
--- a/metrics/metrics-dropwizard/src/main/java/org/apache/james/metrics/dropwizard/DropWizardMetricFactory.java
+++ b/metrics/metrics-dropwizard/src/main/java/org/apache/james/metrics/dropwizard/DropWizardMetricFactory.java
@@ -81,5 +81,6 @@ public class DropWizardMetricFactory implements MetricFactory, Startable {
     @PreDestroy
     public void stop() {
         jmxReporter.stop();
+        metricRegistry.removeMatching((name, metric) -> true);
     }
 }
diff --git a/pom.xml b/pom.xml
index 3ffa5b4..236b695 100644
--- a/pom.xml
+++ b/pom.xml
@@ -1847,6 +1847,11 @@
             </dependency>
             <dependency>
                 <groupId>${james.groupId}</groupId>
+                <artifactId>james-server-webadmin-dropwizard-metrics</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>${james.groupId}</groupId>
                 <artifactId>james-server-webadmin-integration-test-common</artifactId>
                 <version>${project.version}</version>
             </dependency>
diff --git a/server/container/guice/guice-common/src/main/java/org/apache/james/modules/server/DropWizardMetricsModule.java b/server/container/guice/guice-common/src/main/java/org/apache/james/modules/server/DropWizardMetricsModule.java
index 612dd97..f585ebf 100644
--- a/server/container/guice/guice-common/src/main/java/org/apache/james/modules/server/DropWizardMetricsModule.java
+++ b/server/container/guice/guice-common/src/main/java/org/apache/james/modules/server/DropWizardMetricsModule.java
@@ -37,12 +37,12 @@ public class DropWizardMetricsModule extends AbstractModule {
     @Override
     protected void configure() {
         install(new LoggingMetricsModule());
-        bind(MetricRegistry.class).in(Scopes.SINGLETON);
         bind(DropWizardMetricFactory.class).in(Scopes.SINGLETON);
         bind(DropWizardGaugeRegistry.class).in(Scopes.SINGLETON);
         bind(DropWizardJVMMetrics.class).in(Scopes.SINGLETON);
         bind(MetricFactory.class).to(DropWizardMetricFactory.class);
 
+        bind(MetricRegistry.class).toInstance(new MetricRegistry());
         bind(GaugeRegistry.class).to(DropWizardGaugeRegistry.class);
     }
 
diff --git a/server/container/guice/protocols/webadmin/pom.xml b/server/container/guice/protocols/webadmin/pom.xml
index d383898..cedd56d 100644
--- a/server/container/guice/protocols/webadmin/pom.xml
+++ b/server/container/guice/protocols/webadmin/pom.xml
@@ -46,6 +46,11 @@
         </dependency>
         <dependency>
             <groupId>${james.groupId}</groupId>
+            <artifactId>james-server-webadmin-dropwizard-metrics</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>${james.groupId}</groupId>
             <artifactId>testing-base</artifactId>
             <scope>test</scope>
         </dependency>
diff --git a/server/container/guice/protocols/webadmin/src/main/java/org/apache/james/modules/server/MetricsRoutesModule.java b/server/container/guice/protocols/webadmin/src/main/java/org/apache/james/modules/server/MetricsRoutesModule.java
new file mode 100644
index 0000000..1429b23
--- /dev/null
+++ b/server/container/guice/protocols/webadmin/src/main/java/org/apache/james/modules/server/MetricsRoutesModule.java
@@ -0,0 +1,38 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one   *
+ * or more contributor license agreements.  See the NOTICE file *
+ * distributed with this work for additional information        *
+ * regarding copyright ownership.  The ASF licenses this file   *
+ * to you under the Apache License, Version 2.0 (the            *
+ * "License"); you may not use this file except in compliance   *
+ * with the License.  You may obtain a copy of the License at   *
+ *                                                              *
+ *   http://www.apache.org/licenses/LICENSE-2.0                 *
+ *                                                              *
+ * Unless required by applicable law or agreed to in writing,   *
+ * software distributed under the License is distributed on an  *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
+ * KIND, either express or implied.  See the License for the    *
+ * specific language governing permissions and limitations      *
+ * under the License.                                           *
+ ****************************************************************/
+
+package org.apache.james.modules.server;
+
+import org.apache.james.webadmin.Routes;
+import org.apache.james.webadmin.dropwizard.MetricsRoutes;
+
+import com.google.inject.AbstractModule;
+import com.google.inject.Scopes;
+import com.google.inject.multibindings.Multibinder;
+
+public class MetricsRoutesModule extends AbstractModule {
+    @Override
+    protected void configure() {
+        bind(MetricsRoutes.class).in(Scopes.SINGLETON);
+
+        Multibinder.newSetBinder(binder(), Routes.class)
+            .addBinding()
+            .to(MetricsRoutes.class);
+    }
+}
diff --git a/server/container/guice/protocols/webadmin/src/main/java/org/apache/james/modules/server/WebAdminServerModule.java b/server/container/guice/protocols/webadmin/src/main/java/org/apache/james/modules/server/WebAdminServerModule.java
index ff2f263..42fff3e 100644
--- a/server/container/guice/protocols/webadmin/src/main/java/org/apache/james/modules/server/WebAdminServerModule.java
+++ b/server/container/guice/protocols/webadmin/src/main/java/org/apache/james/modules/server/WebAdminServerModule.java
@@ -78,6 +78,7 @@ public class WebAdminServerModule extends AbstractModule {
     protected void configure() {
         install(new TaskRoutesModule());
         install(new HealthCheckRoutesModule());
+        install(new MetricsRoutesModule());
 
         bind(JsonTransformer.class).in(Scopes.SINGLETON);
         bind(WebAdminServer.class).in(Scopes.SINGLETON);
diff --git a/server/protocols/webadmin-integration-test/webadmin-integration-test-common/src/main/java/org/apache/james/webadmin/integration/AuthorizedEndpointsTest.java b/server/protocols/webadmin-integration-test/webadmin-integration-test-common/src/main/java/org/apache/james/webadmin/integration/AuthorizedEndpointsTest.java
index 0ddbf24..8ec6ee7 100644
--- a/server/protocols/webadmin-integration-test/webadmin-integration-test-common/src/main/java/org/apache/james/webadmin/integration/AuthorizedEndpointsTest.java
+++ b/server/protocols/webadmin-integration-test/webadmin-integration-test-common/src/main/java/org/apache/james/webadmin/integration/AuthorizedEndpointsTest.java
@@ -52,6 +52,14 @@ public abstract class AuthorizedEndpointsTest {
     }
 
     @Test
+    void getMetricsShouldNotNeedAuthentication() {
+        when()
+            .get("/metrics")
+        .then()
+            .statusCode(not(HttpStatus.UNAUTHORIZED_401));
+    }
+
+    @Test
     void getSwaggerShouldNotNeedAuthentication() {
         when()
             .get(SwaggerRoutes.SWAGGER_ENDPOINT)
diff --git a/server/protocols/webadmin-integration-test/webadmin-integration-test-common/src/main/java/org/apache/james/webadmin/integration/WebAdminServerIntegrationTest.java b/server/protocols/webadmin-integration-test/webadmin-integration-test-common/src/main/java/org/apache/james/webadmin/integration/WebAdminServerIntegrationTest.java
index b02ee24..4d303a4 100644
--- a/server/protocols/webadmin-integration-test/webadmin-integration-test-common/src/main/java/org/apache/james/webadmin/integration/WebAdminServerIntegrationTest.java
+++ b/server/protocols/webadmin-integration-test/webadmin-integration-test-common/src/main/java/org/apache/james/webadmin/integration/WebAdminServerIntegrationTest.java
@@ -99,6 +99,19 @@ public abstract class WebAdminServerIntegrationTest {
     }
 
     @Test
+    void metricsRoutesShouldBeExposed() {
+        String body = when()
+                .get("/metrics").prettyPeek()
+            .then()
+                .statusCode(HttpStatus.OK_200)
+                .extract()
+                .body()
+                .asString();
+
+        assertThat(body).contains("outgoingMails_total 0.0");
+    }
+
+    @Test
     void healthCheckShouldReturn200WhenCalledRepeatedly() {
         given().get(HealthCheckRoutes.HEALTHCHECK);
         given().get(HealthCheckRoutes.HEALTHCHECK);
diff --git a/server/protocols/webadmin/pom.xml b/server/protocols/webadmin/pom.xml
index db7f387..54a0609 100644
--- a/server/protocols/webadmin/pom.xml
+++ b/server/protocols/webadmin/pom.xml
@@ -36,6 +36,7 @@
         <module>webadmin-cassandra</module>
         <module>webadmin-cassandra-data</module>
         <module>webadmin-core</module>
+        <module>webadmin-dropwizard-metrics</module>
         <module>webadmin-data</module>
         <module>webadmin-jmap</module>
         <module>webadmin-mailbox</module>
diff --git a/server/container/guice/protocols/webadmin/pom.xml b/server/protocols/webadmin/webadmin-dropwizard-metrics/pom.xml
similarity index 51%
copy from server/container/guice/protocols/webadmin/pom.xml
copy to server/protocols/webadmin/webadmin-dropwizard-metrics/pom.xml
index d383898..6094907 100644
--- a/server/container/guice/protocols/webadmin/pom.xml
+++ b/server/protocols/webadmin/webadmin-dropwizard-metrics/pom.xml
@@ -17,32 +17,37 @@
     specific language governing permissions and limitations
     under the License.
 -->
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
     <modelVersion>4.0.0</modelVersion>
     <parent>
         <groupId>org.apache.james</groupId>
-        <artifactId>james-server-guice</artifactId>
+        <artifactId>james-server</artifactId>
         <version>3.6.0-SNAPSHOT</version>
-        <relativePath>../../pom.xml</relativePath>
+        <relativePath>../../../pom.xml</relativePath>
     </parent>
 
-    <artifactId>james-server-guice-webadmin</artifactId>
+    <artifactId>james-server-webadmin-dropwizard-metrics</artifactId>
+    <packaging>jar</packaging>
 
-    <name>Apache James :: Server :: Guice :: Webadmin</name>
-    <description>Webadmin modules for Guice implementation of James server</description>
+    <name>Apache James :: Server :: Web Admin :: Dropwizard metrics</name>
+    <description>HTTP endpoint to expose dropwizard collected metrics. This endpoint is intended to be called by
+    Prometheus.</description>
 
     <dependencies>
         <dependency>
             <groupId>${james.groupId}</groupId>
-            <artifactId>james-server-guice-configuration</artifactId>
+            <artifactId>james-server-webadmin-core</artifactId>
         </dependency>
         <dependency>
             <groupId>${james.groupId}</groupId>
-            <artifactId>james-server-guice-utils</artifactId>
+            <artifactId>james-server-webadmin-core</artifactId>
+            <type>test-jar</type>
+            <scope>test</scope>
         </dependency>
         <dependency>
             <groupId>${james.groupId}</groupId>
-            <artifactId>james-server-webadmin-core</artifactId>
+            <artifactId>metrics-tests</artifactId>
+            <scope>test</scope>
         </dependency>
         <dependency>
             <groupId>${james.groupId}</groupId>
@@ -50,8 +55,33 @@
             <scope>test</scope>
         </dependency>
         <dependency>
-            <groupId>com.google.inject</groupId>
-            <artifactId>guice</artifactId>
+            <groupId>io.dropwizard.metrics</groupId>
+            <artifactId>metrics-core</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>io.prometheus</groupId>
+            <artifactId>simpleclient_dropwizard</artifactId>
+            <version>0.9.0</version>
+        </dependency>
+        <dependency>
+            <groupId>io.prometheus</groupId>
+            <artifactId>simpleclient_servlet</artifactId>
+            <version>0.9.0</version>
+        </dependency>
+        <dependency>
+            <groupId>io.rest-assured</groupId>
+            <artifactId>rest-assured</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.slf4j</groupId>
+            <artifactId>slf4j-api</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.slf4j</groupId>
+            <artifactId>jcl-over-slf4j</artifactId>
+            <scope>test</scope>
         </dependency>
     </dependencies>
-</project>
+
+</project>
\ No newline at end of file
diff --git a/server/protocols/webadmin/webadmin-dropwizard-metrics/src/main/java/org/apache/james/webadmin/dropwizard/MetricsRoutes.java b/server/protocols/webadmin/webadmin-dropwizard-metrics/src/main/java/org/apache/james/webadmin/dropwizard/MetricsRoutes.java
new file mode 100644
index 0000000..8cfe191
--- /dev/null
+++ b/server/protocols/webadmin/webadmin-dropwizard-metrics/src/main/java/org/apache/james/webadmin/dropwizard/MetricsRoutes.java
@@ -0,0 +1,89 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one   *
+ * or more contributor license agreements.  See the NOTICE file *
+ * distributed with this work for additional information        *
+ * regarding copyright ownership.  The ASF licenses this file   *
+ * to you under the Apache License, Version 2.0 (the            *
+ * "License"); you may not use this file except in compliance   *
+ * with the License.  You may obtain a copy of the License at   *
+ *                                                              *
+ *   http://www.apache.org/licenses/LICENSE-2.0                 *
+ *                                                              *
+ * Unless required by applicable law or agreed to in writing,   *
+ * software distributed under the License is distributed on an  *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
+ * KIND, either express or implied.  See the License for the    *
+ * specific language governing permissions and limitations      *
+ * under the License.                                           *
+ ****************************************************************/
+
+package org.apache.james.webadmin.dropwizard;
+
+import java.io.BufferedWriter;
+import java.io.IOException;
+import java.io.Writer;
+import java.util.Optional;
+import java.util.Set;
+
+import javax.inject.Inject;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.james.webadmin.PublicRoutes;
+
+import com.codahale.metrics.MetricRegistry;
+import com.google.common.collect.ImmutableSet;
+
+import io.prometheus.client.CollectorRegistry;
+import io.prometheus.client.dropwizard.DropwizardExports;
+import io.prometheus.client.exporter.common.TextFormat;
+import spark.Request;
+import spark.Response;
+import spark.Service;
+
+/**
+ * Content adapted from https://github.com/prometheus/client_java/blob/master/simpleclient_servlet/src/main/java/io/prometheus/client/exporter/MetricsServlet.java
+ */
+public class MetricsRoutes implements PublicRoutes {
+
+    public static final String BASE = "/metrics";
+    private final CollectorRegistry collectorRegistry;
+
+    @Inject
+    public MetricsRoutes(MetricRegistry registry) {
+        collectorRegistry = CollectorRegistry.defaultRegistry;
+        new DropwizardExports(registry).register(collectorRegistry);
+    }
+
+    @Override
+    public String getBasePath() {
+        return BASE;
+    }
+
+    @Override
+    public void define(Service service) {
+        service.get(BASE, this::getMetrics);
+    }
+
+    public Response getMetrics(Request request, Response response) throws IOException {
+        Set<String> params = parse(request.raw());
+        HttpServletResponse rawResponse = response.raw();
+        rawResponse.setStatus(HttpServletResponse.SC_OK);
+        rawResponse.setContentType(TextFormat.CONTENT_TYPE_004);
+
+        try (Writer writer = new BufferedWriter(rawResponse.getWriter())) {
+            TextFormat.write004(writer, collectorRegistry.filteredMetricFamilySamples(params));
+            writer.flush();
+        }
+        return response;
+    }
+
+
+    private Set<String> parse(HttpServletRequest req) {
+        String[] includedParam = req.getParameterValues("name[]");
+
+        return Optional.ofNullable(includedParam)
+            .map(ImmutableSet::copyOf)
+            .orElse(ImmutableSet.of());
+    }
+}
diff --git a/server/protocols/webadmin-integration-test/webadmin-integration-test-common/src/main/java/org/apache/james/webadmin/integration/AuthorizedEndpointsTest.java b/server/protocols/webadmin/webadmin-dropwizard-metrics/src/test/java/org/apache/james/webadmin/dropwizard/MetricsRoutesTest.java
similarity index 53%
copy from server/protocols/webadmin-integration-test/webadmin-integration-test-common/src/main/java/org/apache/james/webadmin/integration/AuthorizedEndpointsTest.java
copy to server/protocols/webadmin/webadmin-dropwizard-metrics/src/test/java/org/apache/james/webadmin/dropwizard/MetricsRoutesTest.java
index 0ddbf24..90f9ec7 100644
--- a/server/protocols/webadmin-integration-test/webadmin-integration-test-common/src/main/java/org/apache/james/webadmin/integration/AuthorizedEndpointsTest.java
+++ b/server/protocols/webadmin/webadmin-dropwizard-metrics/src/test/java/org/apache/james/webadmin/dropwizard/MetricsRoutesTest.java
@@ -17,45 +17,57 @@
  * under the License.                                           *
  ****************************************************************/
 
-package org.apache.james.webadmin.integration;
+package org.apache.james.webadmin.dropwizard;
 
 import static io.restassured.RestAssured.when;
-import static org.hamcrest.core.IsNot.not;
+import static org.assertj.core.api.Assertions.assertThat;
 
-import org.apache.james.GuiceJamesServer;
-import org.apache.james.utils.WebAdminGuiceProbe;
+import org.apache.james.webadmin.WebAdminServer;
 import org.apache.james.webadmin.WebAdminUtils;
-import org.apache.james.webadmin.routes.HealthCheckRoutes;
-import org.apache.james.webadmin.swagger.routes.SwaggerRoutes;
 import org.eclipse.jetty.http.HttpStatus;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 
+import com.codahale.metrics.MetricRegistry;
+
 import io.restassured.RestAssured;
 
-public abstract class AuthorizedEndpointsTest {
+class MetricsRoutesTest {
+    WebAdminServer webAdminServer;
+    MetricRegistry registry;
 
     @BeforeEach
-    void setUp(GuiceJamesServer guiceJamesServer) {
-        WebAdminGuiceProbe webAdminGuiceProbe = guiceJamesServer.getProbe(WebAdminGuiceProbe.class);
+    void setUp() {
+        registry = new MetricRegistry();
+        webAdminServer = WebAdminUtils.createWebAdminServer(new MetricsRoutes(registry))
+            .start();
 
-        RestAssured.requestSpecification = WebAdminUtils.buildRequestSpecification(webAdminGuiceProbe.getWebAdminPort())
+        RestAssured.requestSpecification = WebAdminUtils.buildRequestSpecification(webAdminServer)
             .build();
+        RestAssured.enableLoggingOfRequestAndResponseIfValidationFails();
     }
 
     @Test
-    void getHealthchecksShouldNotNeedAuthentication() {
-        when()
-            .get(HealthCheckRoutes.HEALTHCHECK)
-        .then()
-            .statusCode(not(HttpStatus.UNAUTHORIZED_401));
-    }
+    void getShouldReturnSeveralMetric() {
+        registry.counter("easy").inc();
+        registry.counter("hard").inc();
+        registry.counter("hard").inc();
 
-    @Test
-    void getSwaggerShouldNotNeedAuthentication() {
-        when()
-            .get(SwaggerRoutes.SWAGGER_ENDPOINT)
+        String body = when()
+            .get("/metrics")
         .then()
-            .statusCode(not(HttpStatus.UNAUTHORIZED_401));
+            .statusCode(HttpStatus.OK_200)
+            .extract()
+            .body()
+            .asString();
+
+        assertThat(body)
+            .contains(
+                    "# HELP hard Generated from Dropwizard metric import (metric=hard, type=com.codahale.metrics.Counter)\n" +
+                    "# TYPE hard gauge\n" +
+                    "hard 2.0\n" +
+                    "# HELP easy Generated from Dropwizard metric import (metric=easy, type=com.codahale.metrics.Counter)\n" +
+                    "# TYPE easy gauge\n" +
+                    "easy 1.0");
     }
 }
\ No newline at end of file


---------------------------------------------------------------------
To unsubscribe, e-mail: notifications-unsubscribe@james.apache.org
For additional commands, e-mail: notifications-help@james.apache.org