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 <vtt...@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-unsubscr...@james.apache.org For additional commands, e-mail: notifications-h...@james.apache.org