From 28ca49bb00afa3e1736cd126cd330e66ef1dd91f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=B4me=20Chilliet?= Date: Tue, 7 Apr 2026 12:26:54 +0200 Subject: [PATCH] fix: Reduce the mixups between apptokens and session ids MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit fix: Reduce the mixups between apptokens and session ids Signed-off-by: Côme Chilliet [skip ci] --- lib/private/User/Session.php | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/lib/private/User/Session.php b/lib/private/User/Session.php index b957352002072..ddebe0a875e66 100644 --- a/lib/private/User/Session.php +++ b/lib/private/User/Session.php @@ -806,6 +806,7 @@ private function validateTokenLoginName(?string $loginName, IToken $token): bool */ public function tryTokenLogin(IRequest $request) { $authHeader = $request->getHeader('Authorization'); + $tokenFromCookie = false; if (str_starts_with($authHeader, 'Bearer ')) { $token = substr($authHeader, 7); } elseif ($request->getCookie($this->config->getSystemValueString('instanceid')) !== null) { @@ -813,6 +814,7 @@ public function tryTokenLogin(IRequest $request) { // session and the request has a session cookie try { $token = $this->session->getId(); + $tokenFromCookie = true; } catch (SessionNotAvailableException $ex) { return false; } @@ -820,18 +822,23 @@ public function tryTokenLogin(IRequest $request) { return false; } - if (!$this->loginWithToken($token)) { + try { + $dbToken = $this->tokenProvider->getToken($token); + } catch (InvalidTokenException $e) { + // Can't really happen but better safe than sorry return false; } - if (!$this->validateToken($token)) { + + if ($dbToken instanceof PublicKeyToken && $dbToken->getType() === IToken::TEMPORARY_TOKEN && !$tokenFromCookie) { + // Session token but from Bearer header, not allowed return false; } - try { - $dbToken = $this->tokenProvider->getToken($token); - } catch (InvalidTokenException $e) { - // Can't really happen but better save than sorry - return true; + if (!$this->loginWithToken($token)) { + return false; + } + if (!$this->validateToken($token)) { + return false; } // Set the session variable so we know this is an app password