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