Backport pull request #16109 from jellyfin/release-10.11.z

Fix SessionInfoWebSocketListener not using SessionInfoDto

Original-merge: e65aff8bc6

Merged-by: nielsvanvelzen <nielsvanvelzen@users.noreply.github.com>

Backported-by: Bond_009 <bond.009@outlook.com>
This commit is contained in:
nielsvanvelzen authored and Bond_009 committed 2026-01-28 12:11:30 -05:00
1 parent 815a153b94
commit 841e4dabb5
3 files changed
+18 -7

No files matched your search

@@ -1186,7 +1186,8 @@ namespace Emby.Server.Implementations.Session
return session; return session;
} }
private SessionInfoDto ToSessionInfoDto(SessionInfo sessionInfo) /// <inheritdoc />
public SessionInfoDto ToSessionInfoDto(SessionInfo sessionInfo)
{ {
return new SessionInfoDto return new SessionInfoDto
{ {
@@ -7,6 +7,7 @@ using MediaBrowser.Controller.Authentication;
using MediaBrowser.Controller.Library; using MediaBrowser.Controller.Library;
using MediaBrowser.Controller.Net; using MediaBrowser.Controller.Net;
using MediaBrowser.Controller.Session; using MediaBrowser.Controller.Session;
using MediaBrowser.Model.Dto;
using MediaBrowser.Model.Session; using MediaBrowser.Model.Session;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
@@ -15,7 +16,7 @@ namespace Jellyfin.Api.WebSocketListeners;
/// <summary> /// <summary>
/// Class SessionInfoWebSocketListener. /// Class SessionInfoWebSocketListener.
/// </summary> /// </summary>
public class SessionInfoWebSocketListener : BasePeriodicWebSocketListener<IEnumerable<SessionInfo>, WebSocketListenerState> public class SessionInfoWebSocketListener : BasePeriodicWebSocketListener<IEnumerable<SessionInfoDto>, WebSocketListenerState>
{ {
private readonly ISessionManager _sessionManager; private readonly ISessionManager _sessionManager;
private bool _disposed; private bool _disposed;
@@ -52,24 +53,26 @@ public class SessionInfoWebSocketListener : BasePeriodicWebSocketListener<IEnume
/// Gets the data to send. /// Gets the data to send.
/// </summary> /// </summary>
/// <returns>Task{SystemInfo}.</returns> /// <returns>Task{SystemInfo}.</returns>
protected override Task<IEnumerable<SessionInfo>> GetDataToSend() protected override Task<IEnumerable<SessionInfoDto>> GetDataToSend()
{ {
return Task.FromResult(_sessionManager.Sessions); return Task.FromResult(_sessionManager.Sessions.Select(_sessionManager.ToSessionInfoDto));
} }
/// <inheritdoc /> /// <inheritdoc />
protected override Task<IEnumerable<SessionInfo>> GetDataToSendForConnection(IWebSocketConnection connection) protected override Task<IEnumerable<SessionInfoDto>> GetDataToSendForConnection(IWebSocketConnection connection)
{ {
var sessions = _sessionManager.Sessions;
// For non-admin users, filter the sessions to only include their own sessions // For non-admin users, filter the sessions to only include their own sessions
if (connection.AuthorizationInfo?.User is not null && if (connection.AuthorizationInfo?.User is not null &&
!connection.AuthorizationInfo.IsApiKey && !connection.AuthorizationInfo.IsApiKey &&
!connection.AuthorizationInfo.User.HasPermission(PermissionKind.IsAdministrator)) !connection.AuthorizationInfo.User.HasPermission(PermissionKind.IsAdministrator))
{ {
var userId = connection.AuthorizationInfo.User.Id; var userId = connection.AuthorizationInfo.User.Id;
return Task.FromResult(_sessionManager.Sessions.Where(s => s.UserId.Equals(userId) || s.ContainsUser(userId))); sessions = sessions.Where(s => s.UserId.Equals(userId) || s.ContainsUser(userId));
} }
return Task.FromResult(_sessionManager.Sessions); return Task.FromResult(sessions.Select(_sessionManager.ToSessionInfoDto));
} }
/// <inheritdoc /> /// <inheritdoc />
@@ -350,5 +350,12 @@ namespace MediaBrowser.Controller.Session
/// <param name="sessionIdOrPlaySessionId">The session id or playsession id.</param> /// <param name="sessionIdOrPlaySessionId">The session id or playsession id.</param>
/// <returns>Task.</returns> /// <returns>Task.</returns>
Task CloseLiveStreamIfNeededAsync(string liveStreamId, string sessionIdOrPlaySessionId); Task CloseLiveStreamIfNeededAsync(string liveStreamId, string sessionIdOrPlaySessionId);
/// <summary>
/// Gets the dto for session info.
/// </summary>
/// <param name="sessionInfo">The session info.</param>
/// <returns><see cref="SessionInfoDto"/> of the session.</returns>
SessionInfoDto ToSessionInfoDto(SessionInfo sessionInfo);
} }
} }