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


The following commit(s) were added to refs/heads/master by this push:
     new 85f9071067 JAMES-3756 DelegationStoreAuthorizator should not fail on 
bad admin virtualHosting (#1405)
85f9071067 is described below

commit 85f90710676eee2fb5d8571b836c27e32ee9bd6d
Author: Benoit TELLIER <[email protected]>
AuthorDate: Tue Jan 24 21:20:03 2023 +0700

    JAMES-3756 DelegationStoreAuthorizator should not fail on bad admin 
virtualHosting (#1405)
    
    It is preferable to fallback to forbidden.
---
 .../adapter/mailbox/DelegationStoreAuthorizator.java     |  9 ++++++++-
 .../adapter/mailbox/DelegationStoreAuthorizatorTest.java | 16 ++++++++++++++++
 2 files changed, 24 insertions(+), 1 deletion(-)

diff --git 
a/server/container/mailbox-adapter/src/main/java/org/apache/james/adapter/mailbox/DelegationStoreAuthorizator.java
 
b/server/container/mailbox-adapter/src/main/java/org/apache/james/adapter/mailbox/DelegationStoreAuthorizator.java
index 8c1b9887e7..a8a5733380 100644
--- 
a/server/container/mailbox-adapter/src/main/java/org/apache/james/adapter/mailbox/DelegationStoreAuthorizator.java
+++ 
b/server/container/mailbox-adapter/src/main/java/org/apache/james/adapter/mailbox/DelegationStoreAuthorizator.java
@@ -49,7 +49,7 @@ public class DelegationStoreAuthorizator implements 
Authorizator {
     public AuthorizationState canLoginAsOtherUser(Username userId, Username 
otherUserId) throws MailboxException {
         boolean isAuthorized = 
Flux.from(delegationStore.authorizedUsers(otherUserId)).hasElement(userId).block();
         try {
-            if (isAuthorized || usersRepository.isAdministrator(userId)) {
+            if (isAuthorized || isAdministrator(userId)) {
                 return AuthorizationState.ALLOWED;
             }
             if (!usersRepository.contains(otherUserId)) {
@@ -61,6 +61,13 @@ public class DelegationStoreAuthorizator implements 
Authorizator {
         }
     }
 
+    private boolean isAdministrator(Username userId) throws 
UsersRepositoryException {
+        if (userId.hasDomainPart() ^ usersRepository.supportVirtualHosting()) {
+            return false;
+        }
+        return usersRepository.isAdministrator(userId);
+    }
+
     @Override
     public Collection<Username> delegatedUsers(Username username) {
         return 
Flux.from(delegationStore.delegatedUsers(username)).collectList()
diff --git 
a/server/container/mailbox-adapter/src/test/java/org/apache/james/adapter/mailbox/DelegationStoreAuthorizatorTest.java
 
b/server/container/mailbox-adapter/src/test/java/org/apache/james/adapter/mailbox/DelegationStoreAuthorizatorTest.java
index e892644d0e..1aba300da4 100644
--- 
a/server/container/mailbox-adapter/src/test/java/org/apache/james/adapter/mailbox/DelegationStoreAuthorizatorTest.java
+++ 
b/server/container/mailbox-adapter/src/test/java/org/apache/james/adapter/mailbox/DelegationStoreAuthorizatorTest.java
@@ -59,6 +59,13 @@ class DelegationStoreAuthorizatorTest {
         assertThat(testee.canLoginAsOtherUser(ADMIN_USER, 
OTHER_USER)).isEqualTo(Authorizator.AuthorizationState.ALLOWED);
     }
 
+    @Test
+    void canLoginAsOtherUserShouldReturnForbiddenWhenWrongVirtualHosting() 
throws Exception {
+        usersRepository.addUser(OTHER_USER, "secret");
+        
assertThat(testee.canLoginAsOtherUser(Username.of("[email protected]"), 
OTHER_USER))
+            .isEqualTo(Authorizator.AuthorizationState.FORBIDDEN);
+    }
+
     @Test
     void 
canLoginAsOtherUserShouldReturnAllowedWhenGivenUserIsDelegatedByOtherUser() 
throws Exception {
         usersRepository.addUser(OTHER_USER, "secret");
@@ -67,6 +74,15 @@ class DelegationStoreAuthorizatorTest {
         assertThat(testee.canLoginAsOtherUser(GIVEN_USER, 
OTHER_USER)).isEqualTo(Authorizator.AuthorizationState.ALLOWED);
     }
 
+    @Test
+    void 
canLoginAsOtherUserShouldReturnAllowedWhenGivenUserIsAdminWithWrongVirtualHosting()
 throws Exception {
+        Username accessor = Username.of("[email protected]");
+        usersRepository.addUser(OTHER_USER, "secret");
+        Mono.from(delegationStore.addAuthorizedUser(OTHER_USER, 
accessor)).block();
+
+        assertThat(testee.canLoginAsOtherUser(accessor, 
OTHER_USER)).isEqualTo(Authorizator.AuthorizationState.ALLOWED);
+    }
+
     @Test
     void 
canLoginAsOtherUserShouldReturnForbiddenWhenGivenUserIsNotAdminAndNotDelegated()
 throws Exception {
         usersRepository.addUser(OTHER_USER, "secret");


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to