浏览代码

Use RequestHelpers.GetSession in SessionWebSocketListener (#14494)

Niels van Velzen 1 周之前
父节点
当前提交
48e93dcbce
共有 2 个文件被更改,包括 19 次插入28 次删除
  1. 9 27
      Emby.Server.Implementations/Session/SessionWebSocketListener.cs
  2. 10 1
      Jellyfin.Api/Helpers/RequestHelpers.cs

+ 9 - 27
Emby.Server.Implementations/Session/SessionWebSocketListener.cs

@@ -5,6 +5,8 @@ using System.Net.WebSockets;
 using System.Threading;
 using System.Threading.Tasks;
 using Jellyfin.Api.Extensions;
+using Jellyfin.Api.Helpers;
+using MediaBrowser.Controller.Library;
 using MediaBrowser.Controller.Net;
 using MediaBrowser.Controller.Net.WebSocketMessages.Outbound;
 using MediaBrowser.Controller.Session;
@@ -44,6 +46,7 @@ namespace Emby.Server.Implementations.Session
         private readonly Lock _webSocketsLock = new();
 
         private readonly ISessionManager _sessionManager;
+        private readonly IUserManager _userManager;
         private readonly ILogger<SessionWebSocketListener> _logger;
         private readonly ILoggerFactory _loggerFactory;
 
@@ -57,14 +60,17 @@ namespace Emby.Server.Implementations.Session
         /// </summary>
         /// <param name="logger">The logger.</param>
         /// <param name="sessionManager">The session manager.</param>
+        /// <param name="userManager">The user manager.</param>
         /// <param name="loggerFactory">The logger factory.</param>
         public SessionWebSocketListener(
             ILogger<SessionWebSocketListener> logger,
             ISessionManager sessionManager,
+            IUserManager userManager,
             ILoggerFactory loggerFactory)
         {
             _logger = logger;
             _sessionManager = sessionManager;
+            _userManager = userManager;
             _loggerFactory = loggerFactory;
             _keepAlive = new System.Timers.Timer(TimeSpan.FromSeconds(WebSocketLostTimeout * IntervalFactor))
             {
@@ -107,33 +113,9 @@ namespace Emby.Server.Implementations.Session
         /// <inheritdoc />
         public async Task ProcessWebSocketConnectedAsync(IWebSocketConnection connection, HttpContext httpContext)
         {
-            var session = await GetSession(httpContext, connection.RemoteEndPoint?.ToString()).ConfigureAwait(false);
-            if (session is not null)
-            {
-                EnsureController(session, connection);
-                await KeepAliveWebSocket(connection).ConfigureAwait(false);
-            }
-            else
-            {
-                _logger.LogWarning("Unable to determine session based on query string: {0}", httpContext.Request.QueryString);
-            }
-        }
-
-        private async Task<SessionInfo?> GetSession(HttpContext httpContext, string? remoteEndpoint)
-        {
-            if (!httpContext.User.Identity?.IsAuthenticated ?? false)
-            {
-                return null;
-            }
-
-            var deviceId = httpContext.User.GetDeviceId();
-            if (httpContext.Request.Query.TryGetValue("deviceId", out var queryDeviceId))
-            {
-                deviceId = queryDeviceId;
-            }
-
-            return await _sessionManager.GetSessionByAuthenticationToken(httpContext.User.GetToken(), deviceId, remoteEndpoint)
-                .ConfigureAwait(false);
+            var session = await RequestHelpers.GetSession(_sessionManager, _userManager, httpContext).ConfigureAwait(false);
+            EnsureController(session, connection);
+            await KeepAliveWebSocket(connection).ConfigureAwait(false);
         }
 
         private void EnsureController(SessionInfo session, IWebSocketConnection connection)

+ 10 - 1
Jellyfin.Api/Helpers/RequestHelpers.cs

@@ -111,7 +111,16 @@ public static class RequestHelpers
         return user.EnableUserPreferenceAccess;
     }
 
-    internal static async Task<SessionInfo> GetSession(ISessionManager sessionManager, IUserManager userManager, HttpContext httpContext, Guid? userId = null)
+    /// <summary>
+    /// Get the session based on http request.
+    /// </summary>
+    /// <param name="sessionManager">The session manager.</param>
+    /// <param name="userManager">The user manager.</param>
+    /// <param name="httpContext">The http context.</param>
+    /// <param name="userId">The optional userid.</param>
+    /// <returns>The session.</returns>
+    /// <exception cref="ResourceNotFoundException">Session not found.</exception>
+    public static async Task<SessionInfo> GetSession(ISessionManager sessionManager, IUserManager userManager, HttpContext httpContext, Guid? userId = null)
     {
         userId ??= httpContext.User.GetUserId();
         User? user = null;