fix: as_user() gateway session cookie fallback (#16437)

Add a fallback that checks for `gateway_sessionid` when no cookie
matches `session_cookie_name`, mirroring the existing fallback in
`Connection.login()`. The finally block now cleans up whichever
cookie name was actually used.

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Adrià Sala
2026-04-30 10:43:08 +02:00
committed by GitHub
parent eac8968217
commit c67d93218f
2 changed files with 165 additions and 4 deletions

View File

@@ -85,15 +85,23 @@ def as_user(v, username, password=None):
if config.use_sessions:
session_id = None
domain = None
cookie_name = connection.session_cookie_name
# requests doesn't provide interface for retrieving
# domain segregated cookies other than iterating.
for cookie in connection.session.cookies:
if cookie.name == connection.session_cookie_name:
if cookie.name == cookie_name:
session_id = cookie.value
domain = cookie.domain
break
if session_id is None and cookie_name != 'gateway_sessionid':
for cookie in connection.session.cookies:
if cookie.name == 'gateway_sessionid':
session_id = cookie.value
domain = cookie.domain
cookie_name = 'gateway_sessionid'
break
if session_id:
del connection.session.cookies[connection.session_cookie_name]
del connection.session.cookies[cookie_name]
kwargs = connection.get_session_requirements()
else:
previous_auth = connection.session.auth
@@ -102,9 +110,11 @@ def as_user(v, username, password=None):
yield
finally:
if config.use_sessions:
del connection.session.cookies[connection.session_cookie_name]
for name in {connection.session_cookie_name, cookie_name}:
with suppress(KeyError):
del connection.session.cookies[name]
if session_id:
connection.session.cookies.set(connection.session_cookie_name, session_id, domain=domain)
connection.session.cookies.set(cookie_name, session_id, domain=domain)
else:
connection.session.auth = previous_auth