You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@james.apache.org by rc...@apache.org on 2024/07/02 07:55:46 UTC
(james-project) 09/09: JAMES-4044 Implement SenderIsInLDAPGroup
This is an automated email from the ASF dual-hosted git repository.
rcordier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git
commit 07571e1f56f263d67c3bcc61d03771638fba31ae
Author: Benoit TELLIER <bt...@linagora.com>
AuthorDate: Fri Jun 28 15:08:43 2024 +0200
JAMES-4044 Implement SenderIsInLDAPGroup
---
docs/modules/servers/partials/LDAPMatchers.adoc | 9 +++++++
server/mailet/ldap/README.md | 9 +++++++
.../james/transport/matchers/IsInLDAPGroup.java | 5 ++--
...IsInLDAPGroup.java => SenderIsInLDAPGroup.java} | 18 +++++++------
.../transport/matchers/IsInLDAPGroupTest.java | 4 ---
...GroupTest.java => SenderIsInLDAPGroupTest.java} | 30 ++++++++++++----------
6 files changed, 46 insertions(+), 29 deletions(-)
diff --git a/docs/modules/servers/partials/LDAPMatchers.adoc b/docs/modules/servers/partials/LDAPMatchers.adoc
index 3331358909..26b6bed7ad 100644
--- a/docs/modules/servers/partials/LDAPMatchers.adoc
+++ b/docs/modules/servers/partials/LDAPMatchers.adoc
@@ -8,6 +8,7 @@ Those include:
- LDAP conditions based on attributes of the recipients
- LDAP conditions based on attributes of the sender
- LDAP groups of the recipients
+ - LDAP groups of the sender
Support is planned for LDAP groups both for sender and recipients.
@@ -71,3 +72,11 @@ For matching recipients against a specific LDAP group:
</mailet>
....
+
+For matching a sender against a specific LDAP group:
+
+....xml
+<mailet matcher="SenderIsInLDAPGroup=cn=mygroup,ou=groups, dc=james,dc=org" class="Null">
+
+</mailet>
+....
diff --git a/server/mailet/ldap/README.md b/server/mailet/ldap/README.md
index 118261bc20..bd36cf574e 100644
--- a/server/mailet/ldap/README.md
+++ b/server/mailet/ldap/README.md
@@ -67,6 +67,15 @@ For matching recipients against a specific LDAP group:
```xml
<mailet matcher="IsInLDAPGroup=cn=mygroup,ou=groups, dc=james,dc=org" class="Null">
+
+</mailet>
+```
+
+
+For matching senders against a specific LDAP group:
+
+```xml
+<mailet matcher="SenderIsInLDAPGroup=cn=mygroup,ou=groups, dc=james,dc=org" class="Null">
</mailet>
```
diff --git a/server/mailet/ldap/src/main/java/org/apache/james/transport/matchers/IsInLDAPGroup.java b/server/mailet/ldap/src/main/java/org/apache/james/transport/matchers/IsInLDAPGroup.java
index 65bf989c1b..128ebab867 100644
--- a/server/mailet/ldap/src/main/java/org/apache/james/transport/matchers/IsInLDAPGroup.java
+++ b/server/mailet/ldap/src/main/java/org/apache/james/transport/matchers/IsInLDAPGroup.java
@@ -23,6 +23,8 @@ import java.util.Collection;
import java.util.Optional;
import java.util.Set;
+import jakarta.inject.Inject;
+
import org.apache.james.core.MailAddress;
import org.apache.james.user.ldap.LDAPConnectionFactory;
import org.apache.james.user.ldap.LdapRepositoryConfiguration;
@@ -30,15 +32,12 @@ import org.apache.mailet.Mail;
import org.apache.mailet.base.GenericMatcher;
import com.github.fge.lambdas.Throwing;
-import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Sets;
import com.unboundid.ldap.sdk.Attribute;
import com.unboundid.ldap.sdk.LDAPConnectionPool;
import com.unboundid.ldap.sdk.LDAPException;
import com.unboundid.ldap.sdk.SearchResultEntry;
-import jakarta.inject.Inject;
-import jakarta.mail.MessagingException;
/**
* Matchers that allow looking up for LDAP group membership for each recipient.
diff --git a/server/mailet/ldap/src/main/java/org/apache/james/transport/matchers/IsInLDAPGroup.java b/server/mailet/ldap/src/main/java/org/apache/james/transport/matchers/SenderIsInLDAPGroup.java
similarity index 88%
copy from server/mailet/ldap/src/main/java/org/apache/james/transport/matchers/IsInLDAPGroup.java
copy to server/mailet/ldap/src/main/java/org/apache/james/transport/matchers/SenderIsInLDAPGroup.java
index 65bf989c1b..8ca5cc4cf8 100644
--- a/server/mailet/ldap/src/main/java/org/apache/james/transport/matchers/IsInLDAPGroup.java
+++ b/server/mailet/ldap/src/main/java/org/apache/james/transport/matchers/SenderIsInLDAPGroup.java
@@ -23,6 +23,8 @@ import java.util.Collection;
import java.util.Optional;
import java.util.Set;
+import jakarta.inject.Inject;
+
import org.apache.james.core.MailAddress;
import org.apache.james.user.ldap.LDAPConnectionFactory;
import org.apache.james.user.ldap.LdapRepositoryConfiguration;
@@ -32,16 +34,13 @@ import org.apache.mailet.base.GenericMatcher;
import com.github.fge.lambdas.Throwing;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableSet;
-import com.google.common.collect.Sets;
import com.unboundid.ldap.sdk.Attribute;
import com.unboundid.ldap.sdk.LDAPConnectionPool;
import com.unboundid.ldap.sdk.LDAPException;
import com.unboundid.ldap.sdk.SearchResultEntry;
-import jakarta.inject.Inject;
-import jakarta.mail.MessagingException;
/**
- * Matchers that allow looking up for LDAP group membership for each recipient.
+ * Matchers that allow looking up for LDAP group membership for the sender.
*
* To enable this matcher one need first to add the james-server-mailet-ldap.jar in the externals-jars folder of your
* James installation.
@@ -49,18 +48,18 @@ import jakarta.mail.MessagingException;
* In order to match the group membership:
*
* <pre><code>
- * <mailet matcher="IsInLDAPGroup=cn=mygroup,ou=groups, dc=james,dc=org" class="Null">
+ * <mailet matcher="SenderIsInLDAPGroup=cn=mygroup,ou=groups, dc=james,dc=org" class="Null">
*
* </mailet>
* </code></pre>
*/
-public class IsInLDAPGroup extends GenericMatcher {
+public class SenderIsInLDAPGroup extends GenericMatcher {
private final LDAPConnectionPool ldapConnectionPool;
private final LdapRepositoryConfiguration configuration;
private String groupDN;
@Inject
- public IsInLDAPGroup(LdapRepositoryConfiguration configuration) throws LDAPException {
+ public SenderIsInLDAPGroup(LdapRepositoryConfiguration configuration) throws LDAPException {
this.configuration = configuration;
ldapConnectionPool = new LDAPConnectionFactory(this.configuration).getLdapConnectionPool();
}
@@ -72,7 +71,10 @@ public class IsInLDAPGroup extends GenericMatcher {
@Override
public Collection<MailAddress> match(Mail mail) {
- return Sets.intersection(ImmutableSet.copyOf(mail.getRecipients()), groupMembers());
+ if (mail.getMaybeSender().asOptional().map(a -> groupMembers().contains(a)).orElse(false)) {
+ return mail.getRecipients();
+ }
+ return ImmutableList.of();
}
private Set<MailAddress> groupMembers() {
diff --git a/server/mailet/ldap/src/test/java/org/apache/james/transport/matchers/IsInLDAPGroupTest.java b/server/mailet/ldap/src/test/java/org/apache/james/transport/matchers/IsInLDAPGroupTest.java
index c599b30cf7..0baf6060ac 100644
--- a/server/mailet/ldap/src/test/java/org/apache/james/transport/matchers/IsInLDAPGroupTest.java
+++ b/server/mailet/ldap/src/test/java/org/apache/james/transport/matchers/IsInLDAPGroupTest.java
@@ -22,8 +22,6 @@ package org.apache.james.transport.matchers;
import static org.apache.james.user.ldap.DockerLdapSingleton.ADMIN;
import static org.apache.james.user.ldap.DockerLdapSingleton.ADMIN_PASSWORD;
import static org.assertj.core.api.Assertions.assertThat;
-import static org.assertj.core.api.Assertions.assertThatCode;
-import static org.assertj.core.api.Assertions.assertThatThrownBy;
import java.util.Collection;
import java.util.Optional;
@@ -42,8 +40,6 @@ import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
-import jakarta.mail.MessagingException;
-
class IsInLDAPGroupTest {
static LdapGenericContainer ldapContainer = DockerLdapSingleton.ldapContainer;
diff --git a/server/mailet/ldap/src/test/java/org/apache/james/transport/matchers/IsInLDAPGroupTest.java b/server/mailet/ldap/src/test/java/org/apache/james/transport/matchers/SenderIsInLDAPGroupTest.java
similarity index 82%
copy from server/mailet/ldap/src/test/java/org/apache/james/transport/matchers/IsInLDAPGroupTest.java
copy to server/mailet/ldap/src/test/java/org/apache/james/transport/matchers/SenderIsInLDAPGroupTest.java
index c599b30cf7..b721cc7d08 100644
--- a/server/mailet/ldap/src/test/java/org/apache/james/transport/matchers/IsInLDAPGroupTest.java
+++ b/server/mailet/ldap/src/test/java/org/apache/james/transport/matchers/SenderIsInLDAPGroupTest.java
@@ -22,8 +22,6 @@ package org.apache.james.transport.matchers;
import static org.apache.james.user.ldap.DockerLdapSingleton.ADMIN;
import static org.apache.james.user.ldap.DockerLdapSingleton.ADMIN_PASSWORD;
import static org.assertj.core.api.Assertions.assertThat;
-import static org.assertj.core.api.Assertions.assertThatCode;
-import static org.assertj.core.api.Assertions.assertThatThrownBy;
import java.util.Collection;
import java.util.Optional;
@@ -42,9 +40,7 @@ import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
-import jakarta.mail.MessagingException;
-
-class IsInLDAPGroupTest {
+class SenderIsInLDAPGroupTest {
static LdapGenericContainer ldapContainer = DockerLdapSingleton.ldapContainer;
@@ -60,16 +56,18 @@ class IsInLDAPGroupTest {
@Test
void shouldMatchGroupMember() throws Exception {
- IsInLDAPGroup testee = new IsInLDAPGroup(LdapRepositoryConfiguration.from(ldapRepositoryConfigurationWithVirtualHosting(ldapContainer)));
+ SenderIsInLDAPGroup testee = new SenderIsInLDAPGroup(LdapRepositoryConfiguration.from(ldapRepositoryConfigurationWithVirtualHosting(ldapContainer)));
FakeMatcherConfig matcherConfig = FakeMatcherConfig.builder()
- .matcherName("IsInLDAPGroup")
+ .matcherName("SenderIsInLDAPGroup")
.condition("cn=mygroup,ou=groups, dc=james,dc=org")
.build();
testee.init(matcherConfig);
- MailAddress recipient = new MailAddress("james-user@james.org");
+ MailAddress sender = new MailAddress("james-user@james.org");
+ MailAddress recipient = new MailAddress("rcpt@james.org");
Collection<MailAddress> matched = testee.match(FakeMail.builder()
.name("default-id")
+ .sender(sender)
.recipient(recipient)
.build());
@@ -78,16 +76,18 @@ class IsInLDAPGroupTest {
@Test
void shouldNotMatchNotGroupMember() throws Exception {
- IsInLDAPGroup testee = new IsInLDAPGroup(LdapRepositoryConfiguration.from(ldapRepositoryConfigurationWithVirtualHosting(ldapContainer)));
+ SenderIsInLDAPGroup testee = new SenderIsInLDAPGroup(LdapRepositoryConfiguration.from(ldapRepositoryConfigurationWithVirtualHosting(ldapContainer)));
FakeMatcherConfig matcherConfig = FakeMatcherConfig.builder()
- .matcherName("IsInLDAPGroup")
+ .matcherName("SenderIsInLDAPGroup")
.condition("cn=mygroup,ou=groups, dc=james,dc=org")
.build();
testee.init(matcherConfig);
- MailAddress recipient = new MailAddress("bob@james.org");
+ MailAddress sender = new MailAddress("bob@james.org");
+ MailAddress recipient = new MailAddress("rcpt@james.org");
Collection<MailAddress> matched = testee.match(FakeMail.builder()
.name("default-id")
+ .sender(sender)
.recipient(recipient)
.build());
@@ -96,16 +96,18 @@ class IsInLDAPGroupTest {
@Test
void shouldNotMatchWhenGroupNotFound() throws Exception {
- IsInLDAPGroup testee = new IsInLDAPGroup(LdapRepositoryConfiguration.from(ldapRepositoryConfigurationWithVirtualHosting(ldapContainer)));
+ SenderIsInLDAPGroup testee = new SenderIsInLDAPGroup(LdapRepositoryConfiguration.from(ldapRepositoryConfigurationWithVirtualHosting(ldapContainer)));
FakeMatcherConfig matcherConfig = FakeMatcherConfig.builder()
- .matcherName("IsInLDAPGroup")
+ .matcherName("SenderIsInLDAPGroup")
.condition("cn=notfound,ou=groups, dc=james,dc=org")
.build();
testee.init(matcherConfig);
- MailAddress recipient = new MailAddress("bob@james.org");
+ MailAddress sender = new MailAddress("james-user@james.org");
+ MailAddress recipient = new MailAddress("rcpt@james.org");
Collection<MailAddress> matched = testee.match(FakeMail.builder()
.name("default-id")
+ .sender(sender)
.recipient(recipient)
.build());
---------------------------------------------------------------------
To unsubscribe, e-mail: notifications-unsubscribe@james.apache.org
For additional commands, e-mail: notifications-help@james.apache.org