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 e8578196791abf54b0d99ff577e81e6d68676d3f Author: Tran Tien Duc <dt...@linagora.com> AuthorDate: Thu Mar 5 15:03:24 2020 +0700 JAMES-3088 Tests and fix for the missing domain checks --- .../user/cassandra/CassandraUsersRepository.java | 7 +- .../apache/james/user/jpa/JPAUsersRepository.java | 6 + .../user/ldap/ReadOnlyUsersLDAPRepository.java | 23 +- .../ReadOnlyUsersLDAPRepositoryInvalidDnTest.java | 2 +- .../user/ldap/ReadOnlyUsersLDAPRepositoryTest.java | 416 +--------- .../james/user/lib/AbstractUsersRepository.java | 18 +- .../user/lib/AbstractUsersRepositoryContract.java | 873 ++++++++++++--------- .../james/user/memory/MemoryUsersRepository.java | 4 + .../user/memory/MemoryUsersRepositoryTest.java | 11 +- .../james/webadmin/routes/AliasRoutesTest.java | 2 - .../james/webadmin/routes/ForwardRoutesTest.java | 2 - .../routes/DeletedMessagesVaultRoutesTest.java | 3 +- 12 files changed, 550 insertions(+), 817 deletions(-) diff --git a/server/data/data-cassandra/src/main/java/org/apache/james/user/cassandra/CassandraUsersRepository.java b/server/data/data-cassandra/src/main/java/org/apache/james/user/cassandra/CassandraUsersRepository.java index fe17614..a903f34 100644 --- a/server/data/data-cassandra/src/main/java/org/apache/james/user/cassandra/CassandraUsersRepository.java +++ b/server/data/data-cassandra/src/main/java/org/apache/james/user/cassandra/CassandraUsersRepository.java @@ -115,7 +115,7 @@ public class CassandraUsersRepository extends AbstractUsersRepository { } @Override - public User getUserByName(Username name) { + public User getUserByName(Username name) throws UsersRepositoryException { return executor.executeSingleRow( getUserStatement.bind() .setString(NAME, name.asString())) @@ -126,6 +126,7 @@ public class CassandraUsersRepository extends AbstractUsersRepository { @Override public void updateUser(User user) throws UsersRepositoryException { + assertDomainPartValid(user.getUserName()); Preconditions.checkArgument(user instanceof DefaultUser); DefaultUser defaultUser = (DefaultUser) user; boolean executed = executor.executeReturnApplied( @@ -143,6 +144,8 @@ public class CassandraUsersRepository extends AbstractUsersRepository { @Override public void removeUser(Username name) throws UsersRepositoryException { + assertDomainPartValid(name); + boolean executed = executor.executeReturnApplied( removeUserStatement.bind() .setString(NAME, name.asString())) @@ -154,7 +157,7 @@ public class CassandraUsersRepository extends AbstractUsersRepository { } @Override - public boolean contains(Username name) { + public boolean contains(Username name) throws UsersRepositoryException { return getUserByName(name) != null; } diff --git a/server/data/data-jpa/src/main/java/org/apache/james/user/jpa/JPAUsersRepository.java b/server/data/data-jpa/src/main/java/org/apache/james/user/jpa/JPAUsersRepository.java index e949a52..3de0be5 100644 --- a/server/data/data-jpa/src/main/java/org/apache/james/user/jpa/JPAUsersRepository.java +++ b/server/data/data-jpa/src/main/java/org/apache/james/user/jpa/JPAUsersRepository.java @@ -46,6 +46,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.github.steveash.guavate.Guavate; +import com.google.common.base.Preconditions; /** * JPA based UserRepository @@ -111,6 +112,9 @@ public class JPAUsersRepository extends AbstractUsersRepository { */ @Override public void updateUser(User user) throws UsersRepositoryException { + Preconditions.checkNotNull(user); + assertDomainPartValid(user.getUserName()); + EntityManager entityManager = entityManagerFactory.createEntityManager(); final EntityTransaction transaction = entityManager.getTransaction(); @@ -142,6 +146,8 @@ public class JPAUsersRepository extends AbstractUsersRepository { */ @Override public void removeUser(Username name) throws UsersRepositoryException { + assertDomainPartValid(name); + EntityManager entityManager = entityManagerFactory.createEntityManager(); final EntityTransaction transaction = entityManager.getTransaction(); diff --git a/server/data/data-ldap/src/main/java/org/apache/james/user/ldap/ReadOnlyUsersLDAPRepository.java b/server/data/data-ldap/src/main/java/org/apache/james/user/ldap/ReadOnlyUsersLDAPRepository.java index c1ec084..3889fb2 100644 --- a/server/data/data-ldap/src/main/java/org/apache/james/user/ldap/ReadOnlyUsersLDAPRepository.java +++ b/server/data/data-ldap/src/main/java/org/apache/james/user/ldap/ReadOnlyUsersLDAPRepository.java @@ -628,9 +628,7 @@ public class ReadOnlyUsersLDAPRepository extends AbstractUsersRepository impleme @Override public void removeUser(Username name) throws UsersRepositoryException { - LOGGER.warn("This user-repository is read-only. Modifications are not permitted."); - throw new UsersRepositoryException( - "This user-repository is read-only. Modifications are not permitted."); + throw new UsersRepositoryException("This user-repository is read-only. Modifications are not permitted."); } @@ -641,17 +639,8 @@ public class ReadOnlyUsersLDAPRepository extends AbstractUsersRepository impleme } @Override - public void addUser(Username username, String password) throws UsersRepositoryException { - LOGGER.error("This user-repository is read-only. Modifications are not permitted."); - throw new UsersRepositoryException( - "This user-repository is read-only. Modifications are not permitted."); - } - - @Override public void updateUser(User user) throws UsersRepositoryException { - LOGGER.error("This user-repository is read-only. Modifications are not permitted."); - throw new UsersRepositoryException( - "This user-repository is read-only. Modifications are not permitted."); + throw new UsersRepositoryException("This user-repository is read-only. Modifications are not permitted."); } /** @@ -664,13 +653,13 @@ public class ReadOnlyUsersLDAPRepository extends AbstractUsersRepository impleme @Override protected void doAddUser(Username username, String password) throws UsersRepositoryException { - LOGGER.error("This user-repository is read-only. Modifications are not permitted."); - throw new UsersRepositoryException( - "This user-repository is read-only. Modifications are not permitted."); + throw new UsersRepositoryException("This user-repository is read-only. Modifications are not permitted."); } @Override - public boolean isAdministrator(Username username) { + public boolean isAdministrator(Username username) throws UsersRepositoryException { + assertValid(username); + if (ldapConfiguration.getAdministratorId().isPresent()) { return ldapConfiguration.getAdministratorId().get().equals(username); } diff --git a/server/data/data-ldap/src/test/java/org/apache/james/user/ldap/ReadOnlyUsersLDAPRepositoryInvalidDnTest.java b/server/data/data-ldap/src/test/java/org/apache/james/user/ldap/ReadOnlyUsersLDAPRepositoryInvalidDnTest.java index d558dd7..18f3c80 100644 --- a/server/data/data-ldap/src/test/java/org/apache/james/user/ldap/ReadOnlyUsersLDAPRepositoryInvalidDnTest.java +++ b/server/data/data-ldap/src/test/java/org/apache/james/user/ldap/ReadOnlyUsersLDAPRepositoryInvalidDnTest.java @@ -53,7 +53,7 @@ class ReadOnlyUsersLDAPRepositoryInvalidDnTest { @AfterAll static void afterAll() { - ldapContainer.start(); + ldapContainer.stop(); } @BeforeEach diff --git a/server/data/data-ldap/src/test/java/org/apache/james/user/ldap/ReadOnlyUsersLDAPRepositoryTest.java b/server/data/data-ldap/src/test/java/org/apache/james/user/ldap/ReadOnlyUsersLDAPRepositoryTest.java index 8fbaa63..44491b8 100644 --- a/server/data/data-ldap/src/test/java/org/apache/james/user/ldap/ReadOnlyUsersLDAPRepositoryTest.java +++ b/server/data/data-ldap/src/test/java/org/apache/james/user/ldap/ReadOnlyUsersLDAPRepositoryTest.java @@ -34,13 +34,11 @@ import org.apache.commons.configuration2.plist.PropertyListConfiguration; import org.apache.commons.configuration2.tree.ImmutableNode; import org.apache.james.core.Username; import org.apache.james.domainlist.api.DomainList; -import org.junit.jupiter.api.AfterAll; -import org.junit.jupiter.api.BeforeAll; import org.apache.james.domainlist.api.mock.SimpleDomainList; -import org.junit.jupiter.api.AfterAll; -import org.junit.jupiter.api.BeforeAll; import org.apache.james.user.lib.AbstractUsersRepository; import org.apache.james.user.lib.AbstractUsersRepositoryContract; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Nested; @@ -49,8 +47,6 @@ import org.junit.jupiter.api.extension.RegisterExtension; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.google.common.collect.ImmutableList; - class ReadOnlyUsersLDAPRepositoryTest { static final Logger LOGGER = LoggerFactory.getLogger(ReadOnlyUsersLDAPRepositoryTest.class); @@ -70,11 +66,11 @@ class ReadOnlyUsersLDAPRepositoryTest { @AfterAll static void afterAll() { - ldapContainer.start(); + ldapContainer.stop(); } @Nested - class WhenEnableVirtualHosting implements AbstractUsersRepositoryContract.WithVirtualHostingContract { + class WhenEnableVirtualHosting implements AbstractUsersRepositoryContract.WithVirtualHostingReadOnlyContract { @RegisterExtension UserRepositoryExtension extension = UserRepositoryExtension.withVirtualHost(); @@ -90,9 +86,8 @@ class ReadOnlyUsersLDAPRepositoryTest { return usersRepository; } - @Override @Test - public void isAdministratorShouldReturnTrueWhenConfiguredAndUserIsAdmin(TestSystem testSystem) throws Exception { + void isAdministratorShouldReturnTrueWhenConfiguredAndUserIsAdmin(TestSystem testSystem) throws Exception { assertThat(testee().isAdministrator(testSystem.getAdmin())).isTrue(); } @@ -122,11 +117,6 @@ class ReadOnlyUsersLDAPRepositoryTest { } @Test - void unknownUserShouldNotBeAbleToLogInWithVirtualHosting() throws Exception { - assertThat(usersRepository.test(UNKNOWN, BAD_PASSWORD)).isFalse(); - } - - @Test void unknownUserShouldNotBeAbleToLogInWhenPasswordIsCorrectWithVirtualHosting() throws Exception { assertThat(usersRepository.test(UNKNOWN, PASSWORD)).isFalse(); } @@ -143,219 +133,21 @@ class ReadOnlyUsersLDAPRepositoryTest { assertThat(usersRepository.contains(usersRepository.getUsername(JAMES_USER_MAIL.asMailAddress()))).isTrue(); } - @Disabled("JAMES-3088 isAdministrator is case sensitive") - @Override - @Test - public void isAdministratorShouldBeCaseInsentive(TestSystem testSystem) throws Exception { - } - - @Disabled("JAMES-3088 This user-repository is read-only. Modifications are not permitted.") - @Override - @Test - public void isAdministratorShouldReturnFalseWhenNotConfigured(TestSystem testSystem) throws Exception { - } - - @Disabled("JAMES-3088 This user-repository is read-only. Modifications are not permitted.") - @Override - @Test - public void addUserShouldThrowWhenSameUsernameWithDifferentCase(TestSystem testSystem) { - } - - @Disabled("JAMES-3088 This user-repository is read-only. Modifications are not permitted.") - @Override - @Test - public void updateUserShouldThrowWhenAUserIsNoMoreInRepository(TestSystem testSystem) { - } - - @Disabled("JAMES-3088 This user-repository is read-only. Modifications are not permitted.") - @Override - @Test - public void removeUserShouldBeCaseInsentive(TestSystem testSystem) { - } - @Disabled("JAMES-3088 Users are provisioned by default from Dockerfile, cannot setup this test case") @Override @Test public void listShouldReturnEmptyIteratorWhenEmptyRepository(TestSystem testSystem) { } - @Disabled("JAMES-3088 This user-repository is read-only. Modifications are not permitted.") - @Override - @Test - public void countUsersShouldReturnNumberOfUsersWhenNotEmptyRepository(TestSystem testSystem) { - } - - @Disabled("JAMES-3088 This user-repository is read-only. Modifications are not permitted.") - @Override - @Test - public void addUserShouldDisableCaseVariation(TestSystem testSystem) { - } - - @Disabled("JAMES-3088 This user-repository is read-only. Modifications are not permitted.") - @Override - @Test - public void updateUserShouldAllowToAuthenticateWithNewPassword(TestSystem testSystem){ - } - - @Disabled("JAMES-3088 This user-repository is read-only. Modifications are not permitted.") - @Override - @Test - public void addUserShouldAddAUserWhenNotEmptyRepository(TestSystem testSystem) { - } - - @Disabled("JAMES-3088 This user-repository is read-only. Modifications are not permitted.") - @Override - @Test - public void testShouldReturnFalseWhenAUserHasAnIncorrectCasePassword(TestSystem testSystem) { - } - - @Disabled("JAMES-3088 This user-repository is read-only. Modifications are not permitted.") - @Override - @Test - public void listShouldReturnExactlyUsersInRepository(TestSystem testSystem) { - } - - @Disabled("JAMES-3088 This user-repository is read-only. Modifications are not permitted.") - @Override - @Test - public void testShouldReturnTrueWhenAUserHasACorrectPassword(TestSystem testSystem) { - } - - @Disabled("JAMES-3088 This user-repository is read-only. Modifications are not permitted.") - @Override - @Test - public void containsShouldBeCaseInsentiveWhenOriginalValueLowerCased(TestSystem testSystem) { - } - - @Disabled("JAMES-3088 This user-repository is read-only. Modifications are not permitted.") - @Override - @Test - public void getUserByNameShouldReturnLowerCaseAddedUser(TestSystem testSystem) { - } - @Disabled("JAMES-3088 Users are provisioned by default from Dockerfile, cannot setup this test case") @Override @Test public void countUsersShouldReturnZeroWhenEmptyRepository() { } - - @Disabled("JAMES-3088 This user-repository is read-only. Modifications are not permitted.") - @Override - @Test - public void testShouldReturnFalseWhenAUserIsNotInRepository(TestSystem testSystem) { - } - - @Disabled("JAMES-3088 This user-repository is read-only. Modifications are not permitted.") - @Override - @Test - public void testShouldReturnTrueWhenAUserHasACorrectPasswordAndOtherCaseInDomain(TestSystem testSystem) { - } - - @Disabled("JAMES-3088 This user-repository is read-only. Modifications are not permitted.") - @Override - @Test - public void addUserShouldDisableCaseVariationWhenOriginalValueLowerCased(TestSystem testSystem) { - } - - @Disabled("JAMES-3088 This user-repository is read-only. Modifications are not permitted.") - @Override - @Test - public void testShouldReturnTrueWhenAUserHasAnIncorrectCaseName(TestSystem testSystem) { - } - - @Disabled("JAMES-3088 This user-repository is read-only. Modifications are not permitted.") - @Override - @Test - public void addUserShouldAddAUserWhenEmptyRepository(TestSystem testSystem) { - } - - @Disabled("JAMES-3088 This user-repository is read-only. Modifications are not permitted.") - @Override - @Test - public void testShouldBeCaseInsentive(TestSystem testSystem) { - } - - @Disabled("JAMES-3088 This user-repository is read-only. Modifications are not permitted.") - @Override - @Test - public void containsShouldBeCaseInsentive(TestSystem testSystem) { - } - - @Disabled("JAMES-3088 This user-repository is read-only. Modifications are not permitted.") - @Override - @Test - public void containsShouldPreserveCaseVariation(TestSystem testSystem) { - } - - @Disabled("JAMES-3088 This user-repository is read-only. Modifications are not permitted.") - @Override - @Test - public void updateUserShouldNotAllowToAuthenticateWithOldPassword(TestSystem testSystem) { - } - - @Disabled("JAMES-3088 This user-repository is read-only. Modifications are not permitted.") - @Override - @Test - public void getUserByNameShouldReturnAUserWhenContainedInRepository(TestSystem testSystem) { - } - - @Disabled("JAMES-3088 This user-repository is read-only. Modifications are not permitted.") - @Override - @Test - public void removeUserShouldRemoveAUserWhenPresentInRepository(TestSystem testSystem) { - } - - @Disabled("JAMES-3088 This user-repository is read-only. Modifications are not permitted.") - @Override - @Test - public void testShouldReturnFalseWhenAUserHasAnIncorrectPassword(TestSystem testSystem) { - } - - @Disabled("JAMES-3088 This user-repository is read-only. Modifications are not permitted.") - @Override - @Test - public void testShouldReturnFalseWhenAUserIsRemovedFromRepository(TestSystem testSystem) { - } - - @Disabled("JAMES-3088 This user-repository is read-only. Modifications are not permitted.") - @Override - @Test - public void removeUserShouldBeCaseInsentiveOnCaseVariationUser(TestSystem testSystem) { - } - - @Disabled("JAMES-3088 This user-repository is read-only. Modifications are not permitted.") - @Override - @Test - public void listShouldReturnLowerCaseUser(TestSystem testSystem) { - } - - @Disabled("JAMES-3088 This user-repository is read-only. Modifications are not permitted.") - @Override - @Test - public void getUserByNameShouldBeCaseInsentive(TestSystem testSystem) { - } - - @Disabled("JAMES-3088 This user-repository is read-only. Modifications are not permitted.") - @Override - @Test - public void getUserByNameShouldReturnUserWhenDifferentCase(TestSystem testSystem) { - } - - @Disabled("JAMES-3088 This user-repository is read-only. Modifications are not permitted.") - @Override - @Test - public void addUserShouldThrowWhenUserAlreadyPresentInRepository(TestSystem testSystem) { - } - - @Disabled("JAMES-3088 This user-repository is read-only. Modifications are not permitted.") - @Override - @Test - public void testShouldBeCaseInsentiveOnCaseVariationUser(TestSystem testSystem) { - } } @Nested - class WhenDisableVirtualHosting implements AbstractUsersRepositoryContract.WithOutVirtualHostingContract { + class WhenDisableVirtualHosting implements AbstractUsersRepositoryContract.WithOutVirtualHostingReadOnlyContract { @RegisterExtension UserRepositoryExtension extension = UserRepositoryExtension.withoutVirtualHosting(); @@ -396,216 +188,22 @@ class ReadOnlyUsersLDAPRepositoryTest { assertThat(usersRepository.contains(usersRepository.getUsername(JAMES_USER_MAIL.asMailAddress()))).isTrue(); } - @Override @Test - public void isAdministratorShouldReturnTrueWhenConfiguredAndUserIsAdmin(TestSystem testSystem) throws Exception { + void isAdministratorShouldReturnTrueWhenConfiguredAndUserIsAdmin(TestSystem testSystem) throws Exception { assertThat(testee().isAdministrator(testSystem.getAdmin())).isTrue(); } - @Disabled("JAMES-3088 isAdministrator is case sensitive") - @Override - @Test - public void isAdministratorShouldBeCaseInsentive(TestSystem testSystem) throws Exception { - } - - @Disabled("JAMES-3088 This user-repository is read-only. Modifications are not permitted.") - @Override - @Test - public void isAdministratorShouldReturnFalseWhenNotConfigured(TestSystem testSystem) throws Exception { - } - - @Disabled("JAMES-3088 This user-repository is read-only. Modifications are not permitted.") - @Override - @Test - public void addUserShouldThrowWhenSameUsernameWithDifferentCase(TestSystem testSystem) { - } - - @Disabled("JAMES-3088 This user-repository is read-only. Modifications are not permitted.") - @Override - @Test - public void updateUserShouldThrowWhenAUserIsNoMoreInRepository(TestSystem testSystem) { - } - - @Disabled("JAMES-3088 This user-repository is read-only. Modifications are not permitted.") - @Override - @Test - public void removeUserShouldBeCaseInsentive(TestSystem testSystem) { - } - @Disabled("JAMES-3088 Users are provisioned by default from Dockerfile, cannot setup this test case") @Override @Test public void listShouldReturnEmptyIteratorWhenEmptyRepository(TestSystem testSystem) { } - @Disabled("JAMES-3088 This user-repository is read-only. Modifications are not permitted.") - @Override - @Test - public void countUsersShouldReturnNumberOfUsersWhenNotEmptyRepository(TestSystem testSystem) { - } - - @Disabled("JAMES-3088 This user-repository is read-only. Modifications are not permitted.") - @Override - @Test - public void addUserShouldDisableCaseVariation(TestSystem testSystem) { - } - - @Disabled("JAMES-3088 This user-repository is read-only. Modifications are not permitted.") - @Override - @Test - public void updateUserShouldAllowToAuthenticateWithNewPassword(TestSystem testSystem){ - } - - @Disabled("JAMES-3088 This user-repository is read-only. Modifications are not permitted.") - @Override - @Test - public void addUserShouldAddAUserWhenNotEmptyRepository(TestSystem testSystem) { - } - - @Disabled("JAMES-3088 This user-repository is read-only. Modifications are not permitted.") - @Override - @Test - public void testShouldReturnFalseWhenAUserHasAnIncorrectCasePassword(TestSystem testSystem) { - } - - @Disabled("JAMES-3088 This user-repository is read-only. Modifications are not permitted.") - @Override - @Test - public void listShouldReturnExactlyUsersInRepository(TestSystem testSystem) { - } - - @Disabled("JAMES-3088 This user-repository is read-only. Modifications are not permitted.") - @Override - @Test - public void testShouldReturnTrueWhenAUserHasACorrectPassword(TestSystem testSystem) { - } - - @Disabled("JAMES-3088 This user-repository is read-only. Modifications are not permitted.") - @Override - @Test - public void containsShouldBeCaseInsentiveWhenOriginalValueLowerCased(TestSystem testSystem) { - } - - @Disabled("JAMES-3088 This user-repository is read-only. Modifications are not permitted.") - @Override - @Test - public void getUserByNameShouldReturnLowerCaseAddedUser(TestSystem testSystem) { - } - @Disabled("JAMES-3088 Users are provisioned by default from Dockerfile, cannot setup this test case") @Override @Test public void countUsersShouldReturnZeroWhenEmptyRepository() { } - - @Disabled("JAMES-3088 This user-repository is read-only. Modifications are not permitted.") - @Override - @Test - public void testShouldReturnFalseWhenAUserIsNotInRepository(TestSystem testSystem) { - } - - @Disabled("JAMES-3088 This user-repository is read-only. Modifications are not permitted.") - @Override - @Test - public void addUserShouldDisableCaseVariationWhenOriginalValueLowerCased(TestSystem testSystem) { - } - - @Disabled("JAMES-3088 This user-repository is read-only. Modifications are not permitted.") - @Override - @Test - public void testShouldReturnTrueWhenAUserHasAnIncorrectCaseName(TestSystem testSystem) { - } - - @Disabled("JAMES-3088 This user-repository is read-only. Modifications are not permitted.") - @Override - @Test - public void addUserShouldAddAUserWhenEmptyRepository(TestSystem testSystem) { - } - - @Disabled("JAMES-3088 This user-repository is read-only. Modifications are not permitted.") - @Override - @Test - public void testShouldBeCaseInsentive(TestSystem testSystem) { - } - - @Disabled("JAMES-3088 This user-repository is read-only. Modifications are not permitted.") - @Override - @Test - public void containsShouldBeCaseInsentive(TestSystem testSystem) { - } - - @Disabled("JAMES-3088 This user-repository is read-only. Modifications are not permitted.") - @Override - @Test - public void containsShouldPreserveCaseVariation(TestSystem testSystem) { - } - - @Disabled("JAMES-3088 This user-repository is read-only. Modifications are not permitted.") - @Override - @Test - public void updateUserShouldNotAllowToAuthenticateWithOldPassword(TestSystem testSystem) { - } - - @Disabled("JAMES-3088 This user-repository is read-only. Modifications are not permitted.") - @Override - @Test - public void getUserByNameShouldReturnAUserWhenContainedInRepository(TestSystem testSystem) { - } - - @Disabled("JAMES-3088 This user-repository is read-only. Modifications are not permitted.") - @Override - @Test - public void removeUserShouldRemoveAUserWhenPresentInRepository(TestSystem testSystem) { - } - - @Disabled("JAMES-3088 This user-repository is read-only. Modifications are not permitted.") - @Override - @Test - public void testShouldReturnFalseWhenAUserHasAnIncorrectPassword(TestSystem testSystem) { - } - - @Disabled("JAMES-3088 This user-repository is read-only. Modifications are not permitted.") - @Override - @Test - public void testShouldReturnFalseWhenAUserIsRemovedFromRepository(TestSystem testSystem) { - } - - @Disabled("JAMES-3088 This user-repository is read-only. Modifications are not permitted.") - @Override - @Test - public void removeUserShouldBeCaseInsentiveOnCaseVariationUser(TestSystem testSystem) { - } - - @Disabled("JAMES-3088 This user-repository is read-only. Modifications are not permitted.") - @Override - @Test - public void listShouldReturnLowerCaseUser(TestSystem testSystem) { - } - - @Disabled("JAMES-3088 This user-repository is read-only. Modifications are not permitted.") - @Override - @Test - public void getUserByNameShouldBeCaseInsentive(TestSystem testSystem) { - } - - @Disabled("JAMES-3088 This user-repository is read-only. Modifications are not permitted.") - @Override - @Test - public void getUserByNameShouldReturnUserWhenDifferentCase(TestSystem testSystem) { - } - - @Disabled("JAMES-3088 This user-repository is read-only. Modifications are not permitted.") - @Override - @Test - public void addUserShouldThrowWhenUserAlreadyPresentInRepository(TestSystem testSystem) { - } - - @Disabled("JAMES-3088 This user-repository is read-only. Modifications are not permitted.") - @Override - @Test - public void testShouldBeCaseInsentiveOnCaseVariationUser(TestSystem testSystem) { - } - } @Nested diff --git a/server/data/data-library/src/main/java/org/apache/james/user/lib/AbstractUsersRepository.java b/server/data/data-library/src/main/java/org/apache/james/user/lib/AbstractUsersRepository.java index b770ff1..3a25105 100644 --- a/server/data/data-library/src/main/java/org/apache/james/user/lib/AbstractUsersRepository.java +++ b/server/data/data-library/src/main/java/org/apache/james/user/lib/AbstractUsersRepository.java @@ -75,6 +75,11 @@ public abstract class AbstractUsersRepository implements UsersRepository, Config @Override public void assertValid(Username username) throws UsersRepositoryException { + assertDomainPartValid(username); + assertLocalPartValid(username); + } + + protected void assertDomainPartValid(Username username) throws UsersRepositoryException { if (supportVirtualHosting()) { // need a @ in the username if (!username.hasDomainPart()) { @@ -95,8 +100,12 @@ public abstract class AbstractUsersRepository implements UsersRepository, Config throw new InvalidUsernameException("Given Username contains a @domainpart but virtualhosting support is disabled"); } } + } - if (!isLocalPartValid(username)) { + private void assertLocalPartValid(Username username) throws InvalidUsernameException { + boolean isValid = CharMatcher.anyOf(ILLEGAL_USERNAME_CHARACTERS) + .matchesNoneOf(username.getLocalPart()); + if (!isValid) { throw new InvalidUsernameException(String.format("Given Username '%s' should not contain any of those characters: %s", username.asString(), ILLEGAL_USERNAME_CHARACTERS)); } @@ -135,6 +144,8 @@ public abstract class AbstractUsersRepository implements UsersRepository, Config @Override public boolean isAdministrator(Username username) throws UsersRepositoryException { + assertValid(username); + return administratorId.map(id -> id.equals(username)) .orElse(false); } @@ -155,9 +166,4 @@ public abstract class AbstractUsersRepository implements UsersRepository, Config throw new UsersRepositoryException("Failed to compute mail address associated with the user", e); } } - - private boolean isLocalPartValid(Username username) { - return CharMatcher.anyOf(ILLEGAL_USERNAME_CHARACTERS) - .matchesNoneOf(username.getLocalPart()); - } } diff --git a/server/data/data-library/src/test/java/org/apache/james/user/lib/AbstractUsersRepositoryContract.java b/server/data/data-library/src/test/java/org/apache/james/user/lib/AbstractUsersRepositoryContract.java index 4780b02..557824f 100644 --- a/server/data/data-library/src/test/java/org/apache/james/user/lib/AbstractUsersRepositoryContract.java +++ b/server/data/data-library/src/test/java/org/apache/james/user/lib/AbstractUsersRepositoryContract.java @@ -19,10 +19,12 @@ package org.apache.james.user.lib; 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.ArrayList; +import java.util.Arrays; import java.util.Iterator; +import java.util.List; import java.util.Optional; import java.util.stream.Stream; @@ -34,6 +36,7 @@ import org.apache.james.user.api.AlreadyExistInUsersRepositoryException; import org.apache.james.user.api.InvalidUsernameException; import org.apache.james.user.api.UsersRepositoryException; import org.apache.james.user.api.model.User; +import org.apache.james.user.lib.model.DefaultUser; import org.junit.jupiter.api.Assumptions; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.BeforeEachCallback; @@ -89,6 +92,7 @@ public interface AbstractUsersRepositoryContract { class TestSystem { static final Domain DOMAIN = Domain.of("james.org"); + static final Domain UNKNOW_DOMAIN = Domain.of("unknown.org"); private final boolean supportVirtualHosting; private final SimpleDomainList domainList; @@ -98,6 +102,8 @@ public interface AbstractUsersRepositoryContract { private final Username user3; private final Username admin; private final Username adminCaseVariation; + private final Username userWithUnknowDomain; + private final Username invalidUsername; TestSystem(boolean supportVirtualHosting) throws Exception { this.supportVirtualHosting = supportVirtualHosting; @@ -108,14 +114,20 @@ public interface AbstractUsersRepositoryContract { user3 = toUsername("username3"); user1CaseVariation = toUsername("uSeRnaMe"); admin = toUsername("admin"); - adminCaseVariation = toUsername("admin"); + adminCaseVariation = toUsername("adMin"); + userWithUnknowDomain = toUsername("unknown", UNKNOW_DOMAIN); + invalidUsername = toUsername("userContains)*("); } private Username toUsername(String login) { + return toUsername(login, DOMAIN); + } + + private Username toUsername(String login, Domain domain) { if (supportVirtualHosting) { - return Username.of(login + '@' + DOMAIN.name()); + return Username.fromLocalPartWithDomain(login, domain); } else { - return Username.of(login); + return Username.fromLocalPartWithoutDomain(login); } } @@ -126,467 +138,584 @@ public interface AbstractUsersRepositoryContract { public Username getAdmin() { return admin; } + + public Username getUserWithUnknowDomain() { + return userWithUnknowDomain; + } } - interface WithVirtualHostingContract extends AbstractUsersRepositoryContract { + AbstractUsersRepository testee(); + interface ReadOnlyContract extends AbstractUsersRepositoryContract { @Test - default void testShouldReturnTrueWhenAUserHasACorrectPasswordAndOtherCaseInDomain(TestSystem testSystem) throws Exception { - testSystem.domainList.addDomain(Domain.of("Domain.OrG")); - String username = "myuser"; - String password = "password"; - testee().addUser(Username.of(username + "@Domain.OrG"), password); + default void countUsersShouldReturnZeroWhenEmptyRepository() throws UsersRepositoryException { + //Given + int expected = 0; + //When + int actual = testee().countUsers(); + //Then + assertThat(actual).isEqualTo(expected); + } - boolean actual = testee().test(Username.of(username + "@domain.org"), password); + @Test + default void listShouldReturnEmptyIteratorWhenEmptyRepository(TestSystem testSystem) throws UsersRepositoryException { + //When + Iterator<Username> actual = testee().list(); + //Then + assertThat(actual) + .toIterable() + .isEmpty(); + } - assertThat(actual).isTrue(); + @Test + default void isAdministratorShouldBeCaseInsentive(TestSystem testSystem) throws Exception { + testee().setAdministratorId(Optional.of(testSystem.admin)); + assertThat(testee().isAdministrator(testSystem.adminCaseVariation)) + .isTrue(); } @Test - default void virtualHostedUsersRepositoryShouldUseFullMailAddressAsUsername() throws Exception { - // Some implementations do not support changing virtual hosting value - Assumptions.assumeTrue(testee().supportVirtualHosting()); + default void testShouldReturnFalseWhenEmptyRepository(TestSystem testSystem) throws UsersRepositoryException { + //When + boolean actual = testee().test(testSystem.user1, "password"); + //Then + assertThat(actual).isFalse(); + } - assertThat(testee().getUsername(new MailAddress("local@domain"))).isEqualTo(Username.of("local@domain")); + @ParameterizedTest + @MethodSource("illegalCharacters") + default void assertValidShouldThrowWhenUsernameLocalPartWithIllegalCharacter(String illegalCharacter) { + assertThatThrownBy(() -> testee().assertValid(Username.of("a" + illegalCharacter + "a"))) + .isInstanceOf(InvalidUsernameException.class); + } + + static Stream<Arguments> illegalCharacters() { + return Stream.of( + "\"", + "(", + ")", + ",", + ":", + ";", + "<", + ">", + "@", + "[", + "\\", + "]", + " ") + .map(Arguments::of); } + } + + interface ReadWriteContract extends AbstractUsersRepositoryContract { @Test - default void getMailAddressForShouldBeIdentityWhenVirtualHosting() throws Exception { - // Some implementations do not support changing virtual hosting value - Assumptions.assumeTrue(testee().supportVirtualHosting()); + default void countUsersShouldReturnNumberOfUsersWhenNotEmptyRepository(TestSystem testSystem) throws UsersRepositoryException { + //Given + List<Username> keys = Arrays.asList(testSystem.user1, testSystem.user2, testSystem.user3); + for (Username username : keys) { + testee().addUser(username, username.asString()); + } + //When + int actual = testee().countUsers(); + //Then + assertThat(actual).isEqualTo(keys.size()); + } - String username = "user@domain"; - assertThat(testee().getMailAddressFor(Username.of(username))) - .isEqualTo(username); + @Test + default void listShouldReturnExactlyUsersInRepository(TestSystem testSystem) throws UsersRepositoryException { + //Given + List<Username> keys = Arrays.asList(testSystem.user1, testSystem.user2, testSystem.user3); + for (Username username : keys) { + testee().addUser(username, username.asString()); + } + //When + Iterator<Username> actual = testee().list(); + //Then + assertThat(actual) + .toIterable() + .containsOnly(testSystem.user1, testSystem.user2, testSystem.user3); } @Test - default void getUserShouldBeCaseInsensitive() throws Exception { - assertThat(testee().getUsername(new MailAddress("lowerUPPER", TestSystem.DOMAIN))) - .isEqualTo(Username.fromLocalPartWithDomain("lowerupper", TestSystem.DOMAIN)); + default void addUserShouldAddAUserWhenEmptyRepository(TestSystem testSystem) throws UsersRepositoryException { + //When + testee().addUser(testSystem.user2, "password2"); + //Then + assertThat(testee().contains(testSystem.user2)).isTrue(); } - } - interface WithOutVirtualHostingContract extends AbstractUsersRepositoryContract { @Test - default void nonVirtualHostedUsersRepositoryShouldUseLocalPartAsUsername() throws Exception { - // Some implementations do not support changing virtual hosting value - Assumptions.assumeFalse(testee().supportVirtualHosting()); + default void containsShouldPreserveCaseVariation(TestSystem testSystem) throws UsersRepositoryException { + testee().addUser(testSystem.user1CaseVariation, "password2"); - assertThat(testee().getUsername(new MailAddress("local@domain"))).isEqualTo(Username.of("local")); + assertThat(testee().contains(testSystem.user1CaseVariation)).isTrue(); } @Test - default void getMailAddressForShouldAppendDefaultDomainWhenNoVirtualHosting(TestSystem testSystem) throws Exception { - // Some implementations do not support changing virtual hosting value - Assumptions.assumeFalse(testee().supportVirtualHosting()); + default void containsShouldBeCaseInsentive(TestSystem testSystem) throws UsersRepositoryException { + testee().addUser(testSystem.user1CaseVariation, "password2"); - String username = "user"; - assertThat(testee().getMailAddressFor(Username.of(username))) - .isEqualTo(new MailAddress(username, testSystem.domainList.getDefaultDomain())); + assertThat(testee().contains(testSystem.user1)).isTrue(); } @Test - default void getUserShouldBeCaseInsensitive() throws Exception { - assertThat(testee().getUsername(new MailAddress("lowerUPPER", TestSystem.DOMAIN))) - .isEqualTo(Username.fromLocalPartWithoutDomain("lowerupper")); + default void containsShouldBeCaseInsentiveWhenOriginalValueLowerCased(TestSystem testSystem) throws UsersRepositoryException { + testee().addUser(testSystem.user1, "password2"); + + assertThat(testee().contains(testSystem.user1CaseVariation)).isTrue(); } - } + @Test + default void addUserShouldDisableCaseVariationWhenOriginalValueLowerCased(TestSystem testSystem) throws UsersRepositoryException { + testee().addUser(testSystem.user1, "password2"); - AbstractUsersRepository testee(); + assertThatThrownBy(() -> testee().addUser(testSystem.user1CaseVariation, "pass")) + .isInstanceOf(UsersRepositoryException.class); + } - @Test - default void countUsersShouldReturnZeroWhenEmptyRepository() throws UsersRepositoryException { - //Given - int expected = 0; - //When - int actual = testee().countUsers(); - //Then - assertThat(actual).isEqualTo(expected); - } + @Test + default void addUserShouldDisableCaseVariation(TestSystem testSystem) throws UsersRepositoryException { + testee().addUser(testSystem.user1CaseVariation, "password2"); - @Test - default void countUsersShouldReturnNumberOfUsersWhenNotEmptyRepository(TestSystem testSystem) throws UsersRepositoryException { - //Given - ArrayList<Username> keys = new ArrayList<>(3); - keys.add(testSystem.user1); - keys.add(testSystem.user2); - keys.add(testSystem.user3); - for (Username username : keys) { - testee().addUser(username, username.asString()); - } - //When - int actual = testee().countUsers(); - //Then - assertThat(actual).isEqualTo(keys.size()); - } + assertThatThrownBy(() -> testee().addUser(testSystem.user1, "pass")) + .isInstanceOf(UsersRepositoryException.class); + } - @Test - default void listShouldReturnEmptyIteratorWhenEmptyRepository(TestSystem testSystem) throws UsersRepositoryException { - //When - Iterator<Username> actual = testee().list(); - //Then - assertThat(actual) - .toIterable() - .isEmpty(); - } + @Test + default void listShouldReturnLowerCaseUser(TestSystem testSystem) throws UsersRepositoryException { + testee().addUser(testSystem.user1CaseVariation, "password2"); - @Test - default void listShouldReturnExactlyUsersInRepository(TestSystem testSystem) throws UsersRepositoryException { - //Given - ArrayList<Username> keys = new ArrayList<>(3); - keys.add(testSystem.user1); - keys.add(testSystem.user2); - keys.add(testSystem.user3); - for (Username username : keys) { - testee().addUser(username, username.asString()); - } - //When - Iterator<Username> actual = testee().list(); - //Then - assertThat(actual) - .toIterable() - .containsOnly(testSystem.user1, testSystem.user2, testSystem.user3); - } + assertThat(testee().list()) + .toIterable() + .containsExactly(testSystem.user1); + } - @Test - default void addUserShouldAddAUserWhenEmptyRepository(TestSystem testSystem) throws UsersRepositoryException { - //When - testee().addUser(testSystem.user2, "password2"); - //Then - assertThat(testee().contains(testSystem.user2)).isTrue(); - } + @Test + default void removeUserShouldBeCaseInsentiveOnCaseVariationUser(TestSystem testSystem) throws UsersRepositoryException { + testee().addUser(testSystem.user1CaseVariation, "password2"); - @Test - default void containsShouldPreserveCaseVariation(TestSystem testSystem) throws UsersRepositoryException { - testee().addUser(testSystem.user1CaseVariation, "password2"); + testee().removeUser(testSystem.user1); - assertThat(testee().contains(testSystem.user1CaseVariation)).isTrue(); - } + assertThat(testee().list()) + .toIterable() + .isEmpty(); + } - @Test - default void containsShouldBeCaseInsentive(TestSystem testSystem) throws UsersRepositoryException { - testee().addUser(testSystem.user1CaseVariation, "password2"); + @Test + default void removeUserShouldBeCaseInsentive(TestSystem testSystem) throws UsersRepositoryException { + testee().addUser(testSystem.user1, "password2"); - assertThat(testee().contains(testSystem.user1)).isTrue(); - } + testee().removeUser(testSystem.user1CaseVariation); - @Test - default void containsShouldBeCaseInsentiveWhenOriginalValueLowerCased(TestSystem testSystem) throws UsersRepositoryException { - testee().addUser(testSystem.user1, "password2"); + assertThat(testee().list()) + .toIterable() + .isEmpty(); + } - assertThat(testee().contains(testSystem.user1CaseVariation)).isTrue(); - } + @Test + default void getUserByNameShouldBeCaseInsentive(TestSystem testSystem) throws UsersRepositoryException { + testee().addUser(testSystem.user1, "password2"); - @Test - default void addUserShouldDisableCaseVariationWhenOriginalValueLowerCased(TestSystem testSystem) throws UsersRepositoryException { - testee().addUser(testSystem.user1, "password2"); + assertThat(testee().getUserByName(testSystem.user1CaseVariation).getUserName()) + .isEqualTo(testSystem.user1); + } - assertThatThrownBy(() -> testee().addUser(testSystem.user1CaseVariation, "pass")) - .isInstanceOf(UsersRepositoryException.class); - } + @Test + default void getUserByNameShouldReturnLowerCaseAddedUser(TestSystem testSystem) throws UsersRepositoryException { + testee().addUser(testSystem.user1CaseVariation, "password2"); - @Test - default void addUserShouldDisableCaseVariation(TestSystem testSystem) throws UsersRepositoryException { - testee().addUser(testSystem.user1CaseVariation, "password2"); + assertThat(testee().getUserByName(testSystem.user1).getUserName()) + .isEqualTo(testSystem.user1); + } - assertThatThrownBy(() -> testee().addUser(testSystem.user1, "pass")) - .isInstanceOf(UsersRepositoryException.class); - } - @Test - default void listShouldReturnLowerCaseUser(TestSystem testSystem) throws UsersRepositoryException { - testee().addUser(testSystem.user1CaseVariation, "password2"); + @Test + default void testShouldBeCaseInsentiveOnCaseVariationUser(TestSystem testSystem) throws UsersRepositoryException { + String password = "password2"; + testee().addUser(testSystem.user1CaseVariation, password); - assertThat(testee().list()) - .toIterable() - .containsExactly(testSystem.user1); - } + assertThat(testee().test(testSystem.user1, password)) + .isTrue(); + } - @Test - default void removeUserShouldBeCaseInsentiveOnCaseVariationUser(TestSystem testSystem) throws UsersRepositoryException { - testee().addUser(testSystem.user1CaseVariation, "password2"); + @Test + default void testShouldBeCaseInsentive(TestSystem testSystem) throws UsersRepositoryException { + String password = "password2"; + testee().addUser(testSystem.user1, password); - testee().removeUser(testSystem.user1); + assertThat(testee().test(testSystem.user1CaseVariation, password)) + .isTrue(); + } - assertThat(testee().list()) - .toIterable() - .isEmpty(); - } + @Test + default void addUserShouldAddAUserWhenNotEmptyRepository(TestSystem testSystem) throws UsersRepositoryException { + //Given + testee().addUser(testSystem.user2, "password2"); + //When + testee().addUser(testSystem.user3, "password3"); + //Then + assertThat(testee().contains(testSystem.user3)).isTrue(); + } - @Test - default void removeUserShouldBeCaseInsentive(TestSystem testSystem) throws UsersRepositoryException { - testee().addUser(testSystem.user1, "password2"); + @Test + default void addUserShouldThrowWhenSameUsernameWithDifferentCase(TestSystem testSystem) throws UsersRepositoryException { + //Given + testee().addUser(testSystem.toUsername("myUsername"), "password"); + //When + assertThatThrownBy(() -> testee().addUser(testSystem.toUsername("MyUsername"), "password")) + .isInstanceOf(AlreadyExistInUsersRepositoryException.class); + } - testee().removeUser(testSystem.user1CaseVariation); + @Test + default void addUserShouldThrowWhenUserAlreadyPresentInRepository(TestSystem testSystem) throws UsersRepositoryException { + //Given + testee().addUser(testSystem.user1, "password"); + //When + assertThatThrownBy(() -> testee().addUser(testSystem.user1, "password2")) + .isInstanceOf(AlreadyExistInUsersRepositoryException.class); + } - assertThat(testee().list()) - .toIterable() - .isEmpty(); - } + @Test + default void getUserByNameShouldReturnAUserWhenContainedInRepository(TestSystem testSystem) throws UsersRepositoryException { + //Given + testee().addUser(testSystem.user1, "password"); + //When + User actual = testee().getUserByName(testSystem.user1); + //Then + assertThat(actual).isNotNull(); + assertThat(actual.getUserName()).isEqualTo(testSystem.user1); + } - @Test - default void getUserByNameShouldBeCaseInsentive(TestSystem testSystem) throws UsersRepositoryException { - testee().addUser(testSystem.user1, "password2"); + @Test + default void getUserByNameShouldReturnUserWhenDifferentCase(TestSystem testSystem) throws UsersRepositoryException { + //Given + testee().addUser(testSystem.toUsername("username"), "password"); + //When + User actual = testee().getUserByName(testSystem.toUsername("uSERNAMe")); + //Then + assertThat(actual).isNotNull(); + assertThat(actual.getUserName()).isEqualTo(testSystem.user1); + } - assertThat(testee().getUserByName(testSystem.user1CaseVariation).getUserName()) - .isEqualTo(testSystem.user1); - } + @Test + default void testShouldReturnTrueWhenAUserHasACorrectPassword(TestSystem testSystem) throws UsersRepositoryException { + //Given + testee().addUser(testSystem.user1, "password"); + //When + boolean actual = testee().test(testSystem.user1, "password"); + //Then + assertThat(actual).isTrue(); + } - @Test - default void getUserByNameShouldReturnLowerCaseAddedUser(TestSystem testSystem) throws UsersRepositoryException { - testee().addUser(testSystem.user1CaseVariation, "password2"); + @Test + default void testShouldReturnFalseWhenAUserHasAnIncorrectPassword(TestSystem testSystem) throws UsersRepositoryException { + //Given + testee().addUser(testSystem.user1, "password"); + //When + boolean actual = testee().test(testSystem.user1, "password2"); + //Then + assertThat(actual).isFalse(); + } - assertThat(testee().getUserByName(testSystem.user1).getUserName()) - .isEqualTo(testSystem.user1); - } + @Test + default void testShouldReturnFalseWhenAUserHasAnIncorrectCasePassword(TestSystem testSystem) throws UsersRepositoryException { + //Given + testee().addUser(testSystem.user1, "password"); + //When + boolean actual = testee().test(testSystem.user1, "Password"); + //Then + assertThat(actual).isFalse(); + } - @Test - default void getUserShouldBeCaseInsentive(TestSystem testSystem) throws Exception { - assertThat(testee().getUsername(testSystem.user1CaseVariation.asMailAddress())) - .isEqualTo(testSystem.user1); - } + @Test + default void testShouldReturnFalseWhenAUserIsNotInRepository(TestSystem testSystem) throws UsersRepositoryException { + //Given + testee().addUser(testSystem.toUsername("username"), "password"); + //When + boolean actual = testee().test(testSystem.toUsername("username2"), "password"); + //Then + assertThat(actual).isFalse(); + } - @Test - default void isAdministratorShouldBeCaseInsentive(TestSystem testSystem) throws Exception { - testee().setAdministratorId(Optional.of(testSystem.admin)); - assertThat(testee().isAdministrator(testSystem.adminCaseVariation)) - .isTrue(); - } + @Test + default void testShouldReturnTrueWhenAUserHasAnIncorrectCaseName(TestSystem testSystem) throws UsersRepositoryException { + //Given + testee().addUser(testSystem.toUsername("username"), "password"); + //When + boolean actual = testee().test(testSystem.toUsername("userName"), "password"); + //Then + assertThat(actual).isTrue(); + } - @Test - default void testShouldBeCaseInsentiveOnCaseVariationUser(TestSystem testSystem) throws UsersRepositoryException { - String password = "password2"; - testee().addUser(testSystem.user1CaseVariation, password); - assertThat(testee().test(testSystem.user1, password)) - .isTrue(); - } + @Test + default void testShouldReturnFalseWhenAUserIsRemovedFromRepository(TestSystem testSystem) throws UsersRepositoryException { + //Given + testee().addUser(testSystem.user1, "password"); + testee().removeUser(testSystem.user1); + //When + boolean actual = testee().test(testSystem.user1, "password"); + //Then + assertThat(actual).isFalse(); + } - @Test - default void testShouldBeCaseInsentive(TestSystem testSystem) throws UsersRepositoryException { - String password = "password2"; - testee().addUser(testSystem.user1, password); + @Test + default void removeUserShouldRemoveAUserWhenPresentInRepository(TestSystem testSystem) throws UsersRepositoryException { + //Given + testee().addUser(testSystem.user1, "password"); + //When + testee().removeUser(testSystem.user1); + //Then + assertThat(testee().contains(testSystem.user1)).isFalse(); + } - assertThat(testee().test(testSystem.user1CaseVariation, password)) - .isTrue(); - } + @Test + default void updateUserShouldAllowToAuthenticateWithNewPassword(TestSystem testSystem) throws UsersRepositoryException { + //Given + testee().addUser(testSystem.user1, "password"); + User user = testee().getUserByName(testSystem.user1); + user.setPassword("newpass"); + //When + testee().updateUser(user); + //Then + assertThat(testee().test(testSystem.user1, "newpass")).isTrue(); + } - @Test - default void addUserShouldAddAUserWhenNotEmptyRepository(TestSystem testSystem) throws UsersRepositoryException { - //Given - testee().addUser(testSystem.user2, "password2"); - //When - testee().addUser(testSystem.user3, "password3"); - //Then - assertThat(testee().contains(testSystem.user3)).isTrue(); - } + @Test + default void updateUserShouldNotAllowToAuthenticateWithOldPassword(TestSystem testSystem) throws UsersRepositoryException { + //Given + testee().addUser(testSystem.user1, "password"); + User user = testee().getUserByName(testSystem.user1); + user.setPassword("newpass"); + //When + testee().updateUser(user); + //Then + assertThat(testee().test(testSystem.user1, "password")).isFalse(); + } - @Test - default void addUserShouldThrowWhenSameUsernameWithDifferentCase(TestSystem testSystem) throws UsersRepositoryException { - //Given - testee().addUser(testSystem.toUsername("myUsername"), "password"); - //When - assertThatThrownBy(() -> testee().addUser(testSystem.toUsername("MyUsername"), "password")) - .isInstanceOf(AlreadyExistInUsersRepositoryException.class); - } + @Test + default void updateUserShouldThrowWhenAUserIsNoMoreInRepository(TestSystem testSystem) throws UsersRepositoryException { + //Given + testee().addUser(testSystem.user1, "password"); + User user = testee().getUserByName(testSystem.user1); + testee().removeUser(testSystem.user1); + //When + assertThatThrownBy(() -> testee().updateUser(user)) + .isInstanceOf(UsersRepositoryException.class); + } - @Test - default void addUserShouldThrowWhenUserAlreadyPresentInRepository(TestSystem testSystem) throws UsersRepositoryException { - //Given - testee().addUser(testSystem.user1, "password"); - //When - assertThatThrownBy(() -> testee().addUser(testSystem.user1, "password2")) - .isInstanceOf(AlreadyExistInUsersRepositoryException.class); - } + @Test + default void removeUserShouldThrowWhenUserNotInRepository(TestSystem testSystem) { + //When + assertThatThrownBy(() -> testee().removeUser(testSystem.user1)) + .isInstanceOf(UsersRepositoryException.class); + } - @Test - default void getUserByNameShouldReturnAUserWhenContainedInRepository(TestSystem testSystem) throws UsersRepositoryException { - //Given - testee().addUser(testSystem.user1, "password"); - //When - User actual = testee().getUserByName(testSystem.user1); - //Then - assertThat(actual).isNotNull(); - assertThat(actual.getUserName()).isEqualTo(testSystem.user1); - } + @Test + default void isAdministratorShouldReturnFalseWhenNotConfigured(TestSystem testSystem) throws Exception { + testee().setAdministratorId(Optional.empty()); - @Test - default void getUserByNameShouldReturnUserWhenDifferentCase(TestSystem testSystem) throws UsersRepositoryException { - //Given - testee().addUser(testSystem.toUsername("username"), "password"); - //When - User actual = testee().getUserByName(testSystem.toUsername("uSERNAMe")); - //Then - assertThat(actual).isNotNull(); - assertThat(actual.getUserName()).isEqualTo(testSystem.user1); - } + assertThat(testee().isAdministrator(testSystem.admin)).isFalse(); + } - @Test - default void testShouldReturnTrueWhenAUserHasACorrectPassword(TestSystem testSystem) throws UsersRepositoryException { - //Given - testee().addUser(testSystem.user1, "password"); - //When - boolean actual = testee().test(testSystem.user1, "password"); - //Then - assertThat(actual).isTrue(); - } + @Test + default void isAdministratorShouldReturnTrueWhenConfiguredAndUserIsAdmin(TestSystem testSystem) throws Exception { + testee().setAdministratorId(Optional.of(testSystem.admin)); - @Test - default void testShouldReturnFalseWhenAUserHasAnIncorrectPassword(TestSystem testSystem) throws UsersRepositoryException { - //Given - testee().addUser(testSystem.user1, "password"); - //When - boolean actual = testee().test(testSystem.user1, "password2"); - //Then - assertThat(actual).isFalse(); - } + assertThat(testee().isAdministrator(testSystem.admin)).isTrue(); + } - @Test - default void testShouldReturnFalseWhenAUserHasAnIncorrectCasePassword(TestSystem testSystem) throws UsersRepositoryException { - //Given - testee().addUser(testSystem.user1, "password"); - //When - boolean actual = testee().test(testSystem.user1, "Password"); - //Then - assertThat(actual).isFalse(); - } + @Test + default void isAdministratorShouldReturnFalseWhenConfiguredAndUserIsNotAdmin(TestSystem testSystem) throws Exception { + testee().setAdministratorId(Optional.of(testSystem.admin)); - @Test - default void testShouldReturnFalseWhenAUserIsNotInRepository(TestSystem testSystem) throws UsersRepositoryException { - //Given - testee().addUser(testSystem.toUsername("username"), "password"); - //When - boolean actual = testee().test(testSystem.toUsername("username2"), "password"); - //Then - assertThat(actual).isFalse(); + assertThat(testee().isAdministrator(testSystem.user1)).isFalse(); + } } - @Test - default void testShouldReturnTrueWhenAUserHasAnIncorrectCaseName(TestSystem testSystem) throws UsersRepositoryException { - //Given - testee().addUser(testSystem.toUsername("username"), "password"); - //When - boolean actual = testee().test(testSystem.toUsername("userName"), "password"); - //Then - assertThat(actual).isTrue(); - } + interface WithVirtualHostingReadWriteContract extends ReadWriteContract { - @Test - default void testShouldReturnFalseWhenEmptyRepository(TestSystem testSystem) throws UsersRepositoryException { - //When - boolean actual = testee().test(testSystem.user1, "password"); - //Then - assertThat(actual).isFalse(); - } + @Test + default void testShouldReturnTrueWhenAUserHasACorrectPasswordAndOtherCaseInDomain(TestSystem testSystem) throws Exception { + testSystem.domainList.addDomain(Domain.of("Domain.OrG")); + String username = "myuser"; + String password = "password"; + testee().addUser(Username.of(username + "@Domain.OrG"), password); - @Test - default void testShouldReturnFalseWhenAUserIsRemovedFromRepository(TestSystem testSystem) throws UsersRepositoryException { - //Given - testee().addUser(testSystem.user1, "password"); - testee().removeUser(testSystem.user1); - //When - boolean actual = testee().test(testSystem.user1, "password"); - //Then - assertThat(actual).isFalse(); - } + boolean actual = testee().test(Username.of(username + "@domain.org"), password); - @Test - default void removeUserShouldRemoveAUserWhenPresentInRepository(TestSystem testSystem) throws UsersRepositoryException { - //Given - testee().addUser(testSystem.user1, "password"); - //When - testee().removeUser(testSystem.user1); - //Then - assertThat(testee().contains(testSystem.user1)).isFalse(); - } + assertThat(actual).isTrue(); + } - @Test - default void removeUserShouldThrowWhenUserNotInRepository(TestSystem testSystem) { - //When - assertThatThrownBy(() -> testee().removeUser(testSystem.user1)) - .isInstanceOf(UsersRepositoryException.class); - } + @Test + default void addUserShouldThrowWhenUserDoesNotBelongToDomainList(TestSystem testSystem) { + assertThatThrownBy(() -> testee().addUser(testSystem.userWithUnknowDomain, "password")) + .isInstanceOf(InvalidUsernameException.class) + .hasMessage("Domain does not exist in DomainList"); + } - @Test - default void updateUserShouldAllowToAuthenticateWithNewPassword(TestSystem testSystem) throws UsersRepositoryException { - //Given - testee().addUser(testSystem.user1, "password"); - User user = testee().getUserByName(testSystem.user1); - user.setPassword("newpass"); - //When - testee().updateUser(user); - //Then - assertThat(testee().test(testSystem.user1, "newpass")).isTrue(); - } + @Test + default void addUserShouldThrowWhenInvalidUser(TestSystem testSystem) { + assertThatThrownBy(() -> testee().addUser(testSystem.invalidUsername, "password")) + .isInstanceOf(InvalidUsernameException.class) + .hasMessageContaining("should not contain any of those characters"); + } - @Test - default void updateUserShouldNotAllowToAuthenticateWithOldPassword(TestSystem testSystem) throws UsersRepositoryException { - //Given - testee().addUser(testSystem.user1, "password"); - User user = testee().getUserByName(testSystem.user1); - user.setPassword("newpass"); - //When - testee().updateUser(user); - //Then - assertThat(testee().test(testSystem.user1, "password")).isFalse(); - } + @Test + default void updateUserShouldThrowWhenUserDoesNotBelongToDomainList(TestSystem testSystem) { + assertThatThrownBy(() -> testee().updateUser(new DefaultUser(testSystem.userWithUnknowDomain, "hasAlg"))) + .isInstanceOf(InvalidUsernameException.class) + .hasMessage("Domain does not exist in DomainList"); + } - @Test - default void updateUserShouldThrowWhenAUserIsNoMoreInRepository(TestSystem testSystem) throws UsersRepositoryException { - //Given - testee().addUser(testSystem.user1, "password"); - User user = testee().getUserByName(testSystem.user1); - testee().removeUser(testSystem.user1); - //When - assertThatThrownBy(() -> testee().updateUser(user)) - .isInstanceOf(UsersRepositoryException.class); - } + @Test + default void updateUserShouldNotThrowInvalidUsernameExceptionWhenInvalidUser(TestSystem testSystem) { + assertThatThrownBy(() -> testee().updateUser(new DefaultUser(testSystem.invalidUsername, "hasAlg"))) + .isNotInstanceOf(InvalidUsernameException.class); + } - @Test - default void isAdministratorShouldReturnFalseWhenNotConfigured(TestSystem testSystem) throws Exception { - testee().setAdministratorId(Optional.empty()); + @Test + default void removeUserShouldThrowWhenUserDoesNotBelongToDomainList(TestSystem testSystem) { + assertThatThrownBy(() -> testee().removeUser(testSystem.userWithUnknowDomain)) + .isInstanceOf(InvalidUsernameException.class) + .hasMessage("Domain does not exist in DomainList"); + } - assertThat(testee().isAdministrator(testSystem.admin)).isFalse(); + @Test + default void removeUserShouldNotThrowInvalidUsernameExceptionWhenInvalidUser(TestSystem testSystem) { + assertThatThrownBy(() -> testee().removeUser(testSystem.invalidUsername)) + .isNotInstanceOf(InvalidUsernameException.class); + } } - @Test - default void isAdministratorShouldReturnTrueWhenConfiguredAndUserIsAdmin(TestSystem testSystem) throws Exception { - testee().setAdministratorId(Optional.of(testSystem.admin)); + interface WithVirtualHostingReadOnlyContract extends ReadOnlyContract { + + @Test + default void getUserByNameShouldNotThrowWhenUserDoesNotBelongToDomainList(TestSystem testSystem) { + assertThatCode(() -> testee().getUserByName(testSystem.userWithUnknowDomain)) + .doesNotThrowAnyException(); + } + + @Test + default void containsShouldNotThrowWhenUserDoesNotBelongToDomainList(TestSystem testSystem) { + assertThatCode(() -> testee().contains(testSystem.userWithUnknowDomain)) + .doesNotThrowAnyException(); + } + + @Test + default void testShouldNotThrowWhenUserDoesNotBelongToDomainList(TestSystem testSystem) { + assertThatCode(() -> testee().test(testSystem.userWithUnknowDomain, "password")) + .doesNotThrowAnyException(); + } + + @Test + default void isAdministratorShouldThrowWhenUserDoesNotBelongToDomainList(TestSystem testSystem) { + assertThatThrownBy(() -> testee().isAdministrator(testSystem.userWithUnknowDomain)) + .isInstanceOf(InvalidUsernameException.class) + .hasMessage("Domain does not exist in DomainList"); + } + + @Test + default void virtualHostedUsersRepositoryShouldUseFullMailAddressAsUsername() throws Exception { + // Some implementations do not support changing virtual hosting value + Assumptions.assumeTrue(testee().supportVirtualHosting()); + + assertThat(testee().getUsername(new MailAddress("local@domain"))).isEqualTo(Username.of("local@domain")); + } + + @Test + default void getMailAddressForShouldBeIdentityWhenVirtualHosting() throws Exception { + // Some implementations do not support changing virtual hosting value + Assumptions.assumeTrue(testee().supportVirtualHosting()); + + String username = "user@domain"; + assertThat(testee().getMailAddressFor(Username.of(username))) + .isEqualTo(username); + } + + @Test + default void getUserShouldBeCaseInsensitive() throws Exception { + assertThat(testee().getUsername(new MailAddress("lowerUPPER", TestSystem.DOMAIN))) + .isEqualTo(Username.fromLocalPartWithDomain("lowerupper", TestSystem.DOMAIN)); + } + + @Test + default void assertDomainPartValidShouldThrowWhenDomainPartIsMissing() throws Exception { + Username withoutDomainPart = Username.fromLocalPartWithoutDomain("localPartOnly"); + + assertThatThrownBy(() -> testee().assertDomainPartValid(withoutDomainPart)) + .isInstanceOf(InvalidUsernameException.class) + .hasMessage("Given Username needs to contain a @domainpart"); + } + + @Test + default void assertDomainPartValidShouldThrowWhenDomainPartIsNotManaged(TestSystem testSystem) { + assertThatThrownBy(() -> testee().assertDomainPartValid(testSystem.userWithUnknowDomain)) + .isInstanceOf(InvalidUsernameException.class) + .hasMessage("Domain does not exist in DomainList"); + } + + @Test + default void assertDomainPartValidShouldNotThrowWhenDomainPartIsManaged() { + Username userWithManagedDomain = Username.fromLocalPartWithDomain( + "localPart", + TestSystem.DOMAIN); - assertThat(testee().isAdministrator(testSystem.admin)).isTrue(); + assertThatCode(() -> testee().assertDomainPartValid(userWithManagedDomain)) + .doesNotThrowAnyException(); + } } - @Test - default void isAdministratorShouldReturnFalseWhenConfiguredAndUserIsNotAdmin(TestSystem testSystem) throws Exception { - testee().setAdministratorId(Optional.of(testSystem.admin)); + interface WithOutVirtualHostingReadOnlyContract extends ReadOnlyContract { + @Test + default void nonVirtualHostedUsersRepositoryShouldUseLocalPartAsUsername() throws Exception { + // Some implementations do not support changing virtual hosting value + Assumptions.assumeFalse(testee().supportVirtualHosting()); + + assertThat(testee().getUsername(new MailAddress("local@domain"))).isEqualTo(Username.of("local")); + } + + @Test + default void getMailAddressForShouldAppendDefaultDomainWhenNoVirtualHosting(TestSystem testSystem) throws Exception { + // Some implementations do not support changing virtual hosting value + Assumptions.assumeFalse(testee().supportVirtualHosting()); + + String username = "user"; + assertThat(testee().getMailAddressFor(Username.of(username))) + .isEqualTo(new MailAddress(username, testSystem.domainList.getDefaultDomain())); + } + + @Test + default void getUserShouldBeCaseInsensitive() throws Exception { + assertThat(testee().getUsername(new MailAddress("lowerUPPER", TestSystem.DOMAIN))) + .isEqualTo(Username.fromLocalPartWithoutDomain("lowerupper")); + } + + @Test + default void assertDomainPartValidShouldThrowWhenDomainPartIsPresent() { + Username withDomainPart = Username.fromLocalPartWithDomain( + "localPart", + TestSystem.DOMAIN); + + assertThatThrownBy(() -> testee().assertDomainPartValid(withDomainPart)) + .isInstanceOf(InvalidUsernameException.class) + .hasMessage("Given Username contains a @domainpart but virtualhosting support is disabled"); + } - assertThat(testee().isAdministrator(testSystem.user1)).isFalse(); + @Test + default void assertDomainPartValidShouldNotThrowWhenDomainPartIsMissing() { + Username withOutDomainPart = Username.fromLocalPartWithoutDomain("localPartOnly"); + + assertThatCode(() -> testee().assertDomainPartValid(withOutDomainPart)) + .doesNotThrowAnyException(); + } } - @ParameterizedTest - @MethodSource("illegalCharacters") - default void assertValidShouldThrowWhenUsernameLocalPartWithIllegalCharacter(String illegalCharacter) { - assertThatThrownBy(() -> testee().assertValid(Username.of("a" + illegalCharacter + "a"))) - .isInstanceOf(InvalidUsernameException.class); + interface WithVirtualHostingContract extends WithVirtualHostingReadOnlyContract, WithVirtualHostingReadWriteContract { } - static Stream<Arguments> illegalCharacters() { - return Stream.of( - "\"", - "(", - ")", - ",", - ":", - ";", - "<", - ">", - "@", - "[", - "\\", - "]", - " ") - .map(Arguments::of); + interface WithOutVirtualHostingContract extends WithOutVirtualHostingReadOnlyContract, ReadWriteContract { } } diff --git a/server/data/data-memory/src/main/java/org/apache/james/user/memory/MemoryUsersRepository.java b/server/data/data-memory/src/main/java/org/apache/james/user/memory/MemoryUsersRepository.java index 2853514..b80c387 100644 --- a/server/data/data-memory/src/main/java/org/apache/james/user/memory/MemoryUsersRepository.java +++ b/server/data/data-memory/src/main/java/org/apache/james/user/memory/MemoryUsersRepository.java @@ -81,6 +81,8 @@ public class MemoryUsersRepository extends AbstractUsersRepository { @Override public void updateUser(User user) throws UsersRepositoryException { + assertDomainPartValid(user.getUserName()); + User existingUser = getUserByName(user.getUserName()); if (existingUser == null) { throw new UsersRepositoryException("Please provide an existing user to update"); @@ -90,6 +92,8 @@ public class MemoryUsersRepository extends AbstractUsersRepository { @Override public void removeUser(Username name) throws UsersRepositoryException { + assertDomainPartValid(name); + if (userByName.remove(name.asString()) == null) { throw new UsersRepositoryException("unable to remove unknown user " + name.asString()); } diff --git a/server/data/data-memory/src/test/java/org/apache/james/user/memory/MemoryUsersRepositoryTest.java b/server/data/data-memory/src/test/java/org/apache/james/user/memory/MemoryUsersRepositoryTest.java index cbae5da..894f7b4 100644 --- a/server/data/data-memory/src/test/java/org/apache/james/user/memory/MemoryUsersRepositoryTest.java +++ b/server/data/data-memory/src/test/java/org/apache/james/user/memory/MemoryUsersRepositoryTest.java @@ -36,6 +36,9 @@ import org.junit.jupiter.api.extension.RegisterExtension; class MemoryUsersRepositoryTest { + private static final String LOCALHOST = "localhost"; + private static final String LOCALHOST_ADDRESS = "127.0.0.1"; + @Nested class WhenEnableVirtualHosting implements AbstractUsersRepositoryContract.WithVirtualHostingContract { @RegisterExtension @@ -62,8 +65,8 @@ class MemoryUsersRepositoryTest { @Test void assertValidShouldNotThrowWhenDomainPartAndVirtualHosting() throws Exception { MemoryDomainList domainList = new MemoryDomainList(new InMemoryDNSService() - .registerMxRecord("localhost", "127.0.0.1") - .registerMxRecord("127.0.0.1", "127.0.0.1")); + .registerMxRecord(LOCALHOST, LOCALHOST_ADDRESS) + .registerMxRecord(LOCALHOST_ADDRESS, LOCALHOST_ADDRESS)); domainList.setAutoDetect(false); domainList.setAutoDetectIP(false); domainList.addDomain(Domain.of("domain.tld")); @@ -77,8 +80,8 @@ class MemoryUsersRepositoryTest { @Test void assertValidShouldNotThrowWhenDomainPartAndDomainNotFound() throws Exception { MemoryDomainList domainList = new MemoryDomainList(new InMemoryDNSService() - .registerMxRecord("localhost", "127.0.0.1") - .registerMxRecord("127.0.0.1", "127.0.0.1")); + .registerMxRecord(LOCALHOST, LOCALHOST_ADDRESS) + .registerMxRecord(LOCALHOST_ADDRESS, LOCALHOST_ADDRESS)); domainList.setAutoDetect(false); domainList.setAutoDetectIP(false); diff --git a/server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/AliasRoutesTest.java b/server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/AliasRoutesTest.java index 2d29cfd..d17afd2 100644 --- a/server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/AliasRoutesTest.java +++ b/server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/AliasRoutesTest.java @@ -35,7 +35,6 @@ import static org.mockito.Mockito.spy; import java.util.List; import java.util.Map; -import org.apache.commons.configuration2.BaseHierarchicalConfiguration; import org.apache.james.core.Domain; import org.apache.james.core.Username; import org.apache.james.dnsservice.api.DNSService; @@ -119,7 +118,6 @@ class AliasRoutesTest { memoryRecipientRewriteTable.setDomainList(domainList); usersRepository = MemoryUsersRepository.withVirtualHosting(domainList); - usersRepository.configure(new BaseHierarchicalConfiguration()); usersRepository.addUser(Username.of(BOB), BOB_PASSWORD); usersRepository.addUser(Username.of(BOB_WITH_SLASH), BOB_WITH_SLASH_PASSWORD); diff --git a/server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/ForwardRoutesTest.java b/server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/ForwardRoutesTest.java index bcecf27..8425f92 100644 --- a/server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/ForwardRoutesTest.java +++ b/server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/ForwardRoutesTest.java @@ -36,7 +36,6 @@ import static org.mockito.Mockito.spy; import java.util.List; import java.util.Map; -import org.apache.commons.configuration2.BaseHierarchicalConfiguration; import org.apache.james.core.Domain; import org.apache.james.core.Username; import org.apache.james.dnsservice.api.DNSService; @@ -118,7 +117,6 @@ class ForwardRoutesTest { MappingSourceModule mappingSourceModule = new MappingSourceModule(); usersRepository = MemoryUsersRepository.withVirtualHosting(domainList); - usersRepository.configure(new BaseHierarchicalConfiguration()); usersRepository.addUser(Username.of(BOB), BOB_PASSWORD); usersRepository.addUser(Username.of(ALICE), ALICE_PASSWORD); diff --git a/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/test/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultRoutesTest.java b/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/test/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultRoutesTest.java index 50a0cec..5990161 100644 --- a/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/test/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultRoutesTest.java +++ b/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/test/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultRoutesTest.java @@ -71,7 +71,6 @@ import java.util.List; import java.util.Optional; import java.util.stream.Stream; -import org.apache.commons.configuration2.BaseHierarchicalConfiguration; import org.apache.james.blob.api.BlobId; import org.apache.james.blob.api.BucketName; import org.apache.james.blob.api.HashBlobId; @@ -129,6 +128,7 @@ import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.ValueSource; import com.google.common.collect.ImmutableList; + import io.restassured.RestAssured; import io.restassured.filter.log.LogDetail; import reactor.core.publisher.Flux; @@ -211,7 +211,6 @@ class DeletedMessagesVaultRoutesTest { domainList.addDomain(DOMAIN); MemoryUsersRepository usersRepository = MemoryUsersRepository.withVirtualHosting(domainList); - usersRepository.configure(new BaseHierarchicalConfiguration()); usersRepository.addUser(USERNAME, "userPassword"); --------------------------------------------------------------------- To unsubscribe, e-mail: server-dev-unsubscr...@james.apache.org For additional commands, e-mail: server-dev-h...@james.apache.org