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 2023/01/06 02:02:48 UTC

[james-project] branch master updated: JAMES-3756 MailboxSession should have a loggedInUser field set to the loggedIn user (#1373)

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 bf448b4d93 JAMES-3756 MailboxSession should have a loggedInUser field set to the loggedIn user (#1373)
bf448b4d93 is described below

commit bf448b4d9391aa25b71df0a79d3c2235af80d4fd
Author: vttran <vt...@linagora.com>
AuthorDate: Fri Jan 6 09:02:30 2023 +0700

    JAMES-3756 MailboxSession should have a loggedInUser field set to the loggedIn user (#1373)
---
 .../java/org/apache/james/mailbox/MailboxSession.java    | 13 ++++++++++---
 .../java/org/apache/james/mailbox/SessionProvider.java   |  8 ++++++++
 .../org/apache/james/mailbox/MailboxSessionUtil.java     |  2 ++
 .../apache/james/mailbox/store/SessionProviderImpl.java  | 16 +++++++++++-----
 .../apache/james/mailbox/store/StoreMailboxManager.java  |  5 +++++
 .../apache/james/jmap/AllowAuthenticationStrategy.java   |  2 +-
 .../jmap/http/AccessTokenAuthenticationStrategy.java     |  2 +-
 .../QueryParameterAccessTokenAuthenticationStrategy.java |  2 +-
 .../jmap/http/AccessTokenAuthenticationStrategyTest.java |  2 +-
 .../james/jmap/http/JWTAuthenticationStrategyTest.java   |  2 +-
 .../james/jmap/http/XUserAuthenticationStrategyTest.java |  3 +++
 .../strategy/AllowAuthenticationStrategy.scala           |  2 +-
 .../james/jmap/http/BasicAuthenticationStrategy.scala    |  2 +-
 .../james/jmap/http/JWTAuthenticationStrategy.java       |  2 +-
 .../james/jmap/http/XUserAuthenticationStrategy.java     |  2 +-
 15 files changed, 48 insertions(+), 17 deletions(-)

diff --git a/mailbox/api/src/main/java/org/apache/james/mailbox/MailboxSession.java b/mailbox/api/src/main/java/org/apache/james/mailbox/MailboxSession.java
index 25df2f4d7f..3ea1460b1e 100644
--- a/mailbox/api/src/main/java/org/apache/james/mailbox/MailboxSession.java
+++ b/mailbox/api/src/main/java/org/apache/james/mailbox/MailboxSession.java
@@ -26,6 +26,7 @@ import java.util.List;
 import java.util.Locale;
 import java.util.Map;
 import java.util.Objects;
+import java.util.Optional;
 
 import org.apache.james.core.Username;
 import org.apache.james.mailbox.model.MailboxConstants;
@@ -98,18 +99,19 @@ public class MailboxSession {
     private final String personalSpace;
     private final SessionId sessionId;
     private final Username userName;
+    private final Optional<Username> loggedInUser;
     private boolean open = true;
     private final List<Locale> localePreferences;
     private final Map<Object, Object> attributes;
     private final char pathSeparator;
     private final SessionType type;
 
-    public MailboxSession(SessionId sessionId, Username userName,
+    public MailboxSession(SessionId sessionId, Username userName, Optional<Username> loggedInUser,
                                 List<Locale> localePreferences, char pathSeparator, SessionType type) {
-        this(sessionId, userName, localePreferences, new ArrayList<>(), null, pathSeparator, type);
+        this(sessionId, userName, loggedInUser, localePreferences, new ArrayList<>(), null, pathSeparator, type);
     }
 
-    public MailboxSession(SessionId sessionId, Username userName,
+    public MailboxSession(SessionId sessionId, Username userName, Optional<Username> loggedInUser,
                           List<Locale> localePreferences, List<String> sharedSpaces, String otherUsersSpace, char pathSeparator, SessionType type) {
         this.sessionId = sessionId;
         this.userName = userName;
@@ -125,6 +127,7 @@ public class MailboxSession {
         this.localePreferences = localePreferences;
         this.attributes = new HashMap<>();
         this.pathSeparator = pathSeparator;
+        this.loggedInUser = loggedInUser;
     }
 
     /**
@@ -166,6 +169,10 @@ public class MailboxSession {
         return userName;
     }
 
+    public Optional<Username> getLoggedInUser() {
+        return loggedInUser;
+    }
+
     /**
      * Gets acceptable localisation for this user in preference order.<br>
      * When localising a phrase, each <code>Locale</code> should be tried in
diff --git a/mailbox/api/src/main/java/org/apache/james/mailbox/SessionProvider.java b/mailbox/api/src/main/java/org/apache/james/mailbox/SessionProvider.java
index 9b21e4448e..1e0b224c41 100644
--- a/mailbox/api/src/main/java/org/apache/james/mailbox/SessionProvider.java
+++ b/mailbox/api/src/main/java/org/apache/james/mailbox/SessionProvider.java
@@ -37,6 +37,7 @@ public interface SessionProvider {
     /**
      * Creates a new system session.<br>
      * A system session is intended to be used for programmatic access.<br>
+     *
      * Use {@link #login(Username, String)} when accessing this API from a
      * protocol.
      *
@@ -46,6 +47,13 @@ public interface SessionProvider {
      */
     MailboxSession createSystemSession(Username userName);
 
+    /**
+     * Creates a session for the given user.
+     *
+     * Use {@link #createSystemSession(Username)} for interactions not done by the user himself.
+     */
+    MailboxSession login(Username userName);
+
     /**
      * Autenticates the given user against the given password.<br>
      * When authenticated and authorized, a session will be supplied
diff --git a/mailbox/api/src/test/java/org/apache/james/mailbox/MailboxSessionUtil.java b/mailbox/api/src/test/java/org/apache/james/mailbox/MailboxSessionUtil.java
index 7b9734f020..e2aa013008 100644
--- a/mailbox/api/src/test/java/org/apache/james/mailbox/MailboxSessionUtil.java
+++ b/mailbox/api/src/test/java/org/apache/james/mailbox/MailboxSessionUtil.java
@@ -21,6 +21,7 @@ package org.apache.james.mailbox;
 
 import java.util.ArrayList;
 import java.util.Locale;
+import java.util.Optional;
 import java.util.concurrent.ThreadLocalRandom;
 
 import org.apache.james.core.Username;
@@ -40,6 +41,7 @@ public class MailboxSessionUtil {
         return new MailboxSession(
             sessionId,
             username,
+            Optional.of(username),
             locales,
             MailboxConstants.DEFAULT_DELIMITER,
             MailboxSession.SessionType.User);
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/SessionProviderImpl.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/SessionProviderImpl.java
index 396673a3c1..01f637a025 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/SessionProviderImpl.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/SessionProviderImpl.java
@@ -20,6 +20,7 @@
 package org.apache.james.mailbox.store;
 
 import java.util.ArrayList;
+import java.util.Optional;
 
 import javax.inject.Inject;
 
@@ -54,13 +55,18 @@ public class SessionProviderImpl implements SessionProvider {
 
     @Override
     public MailboxSession createSystemSession(Username userName) {
-        return createSession(userName, MailboxSession.SessionType.System);
+        return createSession(userName, Optional.empty(), MailboxSession.SessionType.System);
+    }
+
+    @Override
+    public MailboxSession login(Username userName) {
+        return createSession(userName, Optional.of(userName), MailboxSession.SessionType.System);
     }
 
     @Override
     public MailboxSession login(Username userid, String passwd) throws MailboxException {
         if (isValidLogin(userid, passwd)) {
-            return createSession(userid, MailboxSession.SessionType.User);
+            return createSession(userid, Optional.ofNullable(userid), MailboxSession.SessionType.User);
         } else {
             throw new BadCredentialsException();
         }
@@ -79,7 +85,7 @@ public class SessionProviderImpl implements SessionProvider {
         Authorizator.AuthorizationState authorizationState = authorizator.user(givenUserid).canLoginAs(otherUserId);
         switch (authorizationState) {
             case ALLOWED:
-                return createSystemSession(otherUserId);
+                return createSession(otherUserId, Optional.of(givenUserid), MailboxSession.SessionType.System);
             case FORBIDDEN:
                 throw new ForbiddenDelegationException(givenUserid, otherUserId);
             case UNKNOWN_USER:
@@ -96,8 +102,8 @@ public class SessionProviderImpl implements SessionProvider {
         }
     }
 
-    private MailboxSession createSession(Username userName, MailboxSession.SessionType type) {
-        return new MailboxSession(newSessionId(), userName, new ArrayList<>(), getDelimiter(), type);
+    private MailboxSession createSession(Username userName, Optional<Username> loggedInUser, MailboxSession.SessionType type) {
+        return new MailboxSession(newSessionId(), userName, loggedInUser, new ArrayList<>(), getDelimiter(), type);
     }
 
     private MailboxSession.SessionId newSessionId() {
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java
index 8d374d587a..80aa7f98d2 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java
@@ -253,6 +253,11 @@ public class StoreMailboxManager implements MailboxManager {
         return sessionProvider.login(userid, passwd);
     }
 
+    @Override
+    public MailboxSession login(Username userid) {
+        return sessionProvider.login(userid);
+    }
+
     @Override
     public MailboxSession loginAsOtherUser(Username adminUserid, String passwd, Username otherUserId) throws MailboxException {
         return sessionProvider.loginAsOtherUser(adminUserid, passwd, otherUserId);
diff --git a/server/protocols/jmap-draft-integration-testing/jmap-draft-integration-testing-common/src/test/java/org/apache/james/jmap/AllowAuthenticationStrategy.java b/server/protocols/jmap-draft-integration-testing/jmap-draft-integration-testing-common/src/test/java/org/apache/james/jmap/AllowAuthenticationStrategy.java
index f69e68f9f8..3983436993 100644
--- a/server/protocols/jmap-draft-integration-testing/jmap-draft-integration-testing-common/src/test/java/org/apache/james/jmap/AllowAuthenticationStrategy.java
+++ b/server/protocols/jmap-draft-integration-testing/jmap-draft-integration-testing-common/src/test/java/org/apache/james/jmap/AllowAuthenticationStrategy.java
@@ -44,7 +44,7 @@ public class AllowAuthenticationStrategy implements AuthenticationStrategy {
 
     @Override
     public Mono<MailboxSession> createMailboxSession(HttpServerRequest httpRequest) {
-        return Mono.fromCallable(() -> mailboxManager.createSystemSession(BOB));
+        return Mono.fromCallable(() -> mailboxManager.login(BOB));
     }
 
     @Override
diff --git a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/http/AccessTokenAuthenticationStrategy.java b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/http/AccessTokenAuthenticationStrategy.java
index c9ca5750ca..59471453f1 100644
--- a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/http/AccessTokenAuthenticationStrategy.java
+++ b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/http/AccessTokenAuthenticationStrategy.java
@@ -51,7 +51,7 @@ public class AccessTokenAuthenticationStrategy implements AuthenticationStrategy
             .filter(tokenString -> !tokenString.startsWith("Bearer"))
             .map(AccessToken::fromString)
             .flatMap(item -> Mono.from(accessTokenManager.getUsernameFromToken(item)))
-            .map(mailboxManager::createSystemSession)
+            .map(mailboxManager::login)
             .onErrorResume(InvalidAccessToken.class, error -> Mono.error(new UnauthorizedException("Invalid access token", error)))
             .onErrorResume(NotAnAccessTokenException.class, error -> Mono.error(new UnauthorizedException("Not an access token", error)));
     }
diff --git a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/http/QueryParameterAccessTokenAuthenticationStrategy.java b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/http/QueryParameterAccessTokenAuthenticationStrategy.java
index 1dab2ea36f..eb30c07f5b 100644
--- a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/http/QueryParameterAccessTokenAuthenticationStrategy.java
+++ b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/http/QueryParameterAccessTokenAuthenticationStrategy.java
@@ -57,7 +57,7 @@ public class QueryParameterAccessTokenAuthenticationStrategy implements Authenti
             .filter(tokenManager::isValid)
             .map(AttachmentAccessToken::getUsername)
             .map(Username::of)
-            .map(mailboxManager::createSystemSession);
+            .map(mailboxManager::login);
     }
 
     @Override
diff --git a/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/http/AccessTokenAuthenticationStrategyTest.java b/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/http/AccessTokenAuthenticationStrategyTest.java
index c519ceac11..f90b75e570 100644
--- a/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/http/AccessTokenAuthenticationStrategyTest.java
+++ b/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/http/AccessTokenAuthenticationStrategyTest.java
@@ -115,7 +115,7 @@ public class AccessTokenAuthenticationStrategyTest {
         Username username = Username.of("123456789");
         MailboxSession fakeMailboxSession = mock(MailboxSession.class);
 
-        when(mockedMailboxManager.createSystemSession(eq(username)))
+        when(mockedMailboxManager.login(eq(username)))
             .thenReturn(fakeMailboxSession);
 
         UUID authHeader = UUID.randomUUID();
diff --git a/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/http/JWTAuthenticationStrategyTest.java b/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/http/JWTAuthenticationStrategyTest.java
index 6bdd2e500c..73cc2769ce 100644
--- a/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/http/JWTAuthenticationStrategyTest.java
+++ b/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/http/JWTAuthenticationStrategyTest.java
@@ -122,7 +122,7 @@ public class JWTAuthenticationStrategyTest {
         MailboxSession fakeMailboxSession = mock(MailboxSession.class);
 
         when(stubTokenVerifier.verifyAndExtractLogin(validAuthHeader)).thenReturn(Optional.of(username));
-        when(mockedMailboxManager.createSystemSession(eq(Username.of(username))))
+        when(mockedMailboxManager.login(eq(Username.of(username))))
                 .thenReturn(fakeMailboxSession);
         when(mockedHeaders.get(AUTHORIZATION_HEADERS))
             .thenReturn(fakeAuthHeaderWithPrefix);
diff --git a/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/http/XUserAuthenticationStrategyTest.java b/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/http/XUserAuthenticationStrategyTest.java
index 65ce5ed10d..a52951bfe1 100644
--- a/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/http/XUserAuthenticationStrategyTest.java
+++ b/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/http/XUserAuthenticationStrategyTest.java
@@ -57,6 +57,9 @@ public class XUserAuthenticationStrategyTest {
         when(mockedMailboxManager.createSystemSession(any()))
             .thenReturn(fakeMailboxSession);
 
+        when(mockedMailboxManager.login(any()))
+            .thenReturn(fakeMailboxSession);
+
         when(mockedRequest.requestHeaders())
             .thenReturn(mockedHeaders);
 
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/custom/authentication/strategy/AllowAuthenticationStrategy.scala b/server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/scala/org/apache/james/jmap/rfc8621/contract/custom/authentication/strategy/AllowAuthenticationStrategy.scala
index 04fd0f5339..9f9a1cad40 100644
--- a/server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/scala/org/apache/james/jmap/rfc8621/contract/custom/authentication/strategy/AllowAuthenticationStrategy.scala
+++ b/server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/scala/org/apache/james/jmap/rfc8621/contract/custom/authentication/strategy/AllowAuthenticationStrategy.scala
@@ -30,7 +30,7 @@ import reactor.netty.http.server.HttpServerRequest
 
 case class AllowAuthenticationStrategy @Inject() (mailboxManager: MailboxManager) extends AuthenticationStrategy {
   override def createMailboxSession(httpRequest: HttpServerRequest): Mono[MailboxSession] =
-    SMono.fromCallable(() => mailboxManager.createSystemSession(Fixture.BOB))
+    SMono.fromCallable(() => mailboxManager.login(Fixture.BOB))
       .asJava()
 
   override def correspondingChallenge(): AuthenticationChallenge =
diff --git a/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/http/BasicAuthenticationStrategy.scala b/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/http/BasicAuthenticationStrategy.scala
index 4baf0c9f27..309f54b84f 100644
--- a/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/http/BasicAuthenticationStrategy.scala
+++ b/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/http/BasicAuthenticationStrategy.scala
@@ -118,7 +118,7 @@ class BasicAuthenticationStrategy @Inject()(val usersRepository: UsersRepository
       .handle(publishNext)
       .filterWhen(isValid)
       .map(_.username)
-      .map(mailboxManager.createSystemSession)
+      .map(mailboxManager.login)
       .asJava()
 
 
diff --git a/server/protocols/jmap/src/main/java/org/apache/james/jmap/http/JWTAuthenticationStrategy.java b/server/protocols/jmap/src/main/java/org/apache/james/jmap/http/JWTAuthenticationStrategy.java
index fc13f18bbc..17cbcfee79 100644
--- a/server/protocols/jmap/src/main/java/org/apache/james/jmap/http/JWTAuthenticationStrategy.java
+++ b/server/protocols/jmap/src/main/java/org/apache/james/jmap/http/JWTAuthenticationStrategy.java
@@ -71,7 +71,7 @@ public class JWTAuthenticationStrategy implements AuthenticationStrategy {
 
                 return username;
             }).subscribeOn(ReactorUtils.BLOCKING_CALL_WRAPPER))
-            .map(mailboxManager::createSystemSession);
+            .map(mailboxManager::login);
     }
 
     @Override
diff --git a/server/protocols/jmap/src/main/java/org/apache/james/jmap/http/XUserAuthenticationStrategy.java b/server/protocols/jmap/src/main/java/org/apache/james/jmap/http/XUserAuthenticationStrategy.java
index 6de5542511..e915bc1adf 100644
--- a/server/protocols/jmap/src/main/java/org/apache/james/jmap/http/XUserAuthenticationStrategy.java
+++ b/server/protocols/jmap/src/main/java/org/apache/james/jmap/http/XUserAuthenticationStrategy.java
@@ -68,7 +68,7 @@ public class XUserAuthenticationStrategy implements AuthenticationStrategy {
             } catch (UsersRepositoryException e) {
                 throw new UnauthorizedException("Invalid username", e);
             }
-            return mailboxManager.createSystemSession(username);
+            return mailboxManager.login(username);
         }).subscribeOn(ReactorUtils.BLOCKING_CALL_WRAPPER);
     }
 


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