From 6fb6b5f1766a1f37a61b9faaa40209bab995bf30 Mon Sep 17 00:00:00 2001 From: Cody Robibero Date: Sun, 14 Apr 2024 08:18:36 -0600 Subject: Validate item access (#11171) --- Jellyfin.Api/Controllers/MediaInfoController.cs | 42 +++++++++++++++++++------ 1 file changed, 33 insertions(+), 9 deletions(-) (limited to 'Jellyfin.Api/Controllers/MediaInfoController.cs') diff --git a/Jellyfin.Api/Controllers/MediaInfoController.cs b/Jellyfin.Api/Controllers/MediaInfoController.cs index 742012b71..bc52be184 100644 --- a/Jellyfin.Api/Controllers/MediaInfoController.cs +++ b/Jellyfin.Api/Controllers/MediaInfoController.cs @@ -8,8 +8,10 @@ using Jellyfin.Api.Attributes; using Jellyfin.Api.Extensions; using Jellyfin.Api.Helpers; using Jellyfin.Api.Models.MediaInfoDtos; +using Jellyfin.Extensions; using MediaBrowser.Common.Extensions; using MediaBrowser.Controller.Devices; +using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Library; using MediaBrowser.Model.MediaInfo; using Microsoft.AspNetCore.Authorization; @@ -32,6 +34,7 @@ public class MediaInfoController : BaseJellyfinApiController private readonly ILibraryManager _libraryManager; private readonly ILogger _logger; private readonly MediaInfoHelper _mediaInfoHelper; + private readonly IUserManager _userManager; /// /// Initializes a new instance of the class. @@ -41,18 +44,21 @@ public class MediaInfoController : BaseJellyfinApiController /// Instance of the interface. /// Instance of the interface. /// Instance of the . + /// Instance of the interface.. public MediaInfoController( IMediaSourceManager mediaSourceManager, IDeviceManager deviceManager, ILibraryManager libraryManager, ILogger logger, - MediaInfoHelper mediaInfoHelper) + MediaInfoHelper mediaInfoHelper, + IUserManager userManager) { _mediaSourceManager = mediaSourceManager; _deviceManager = deviceManager; _libraryManager = libraryManager; _logger = logger; _mediaInfoHelper = mediaInfoHelper; + _userManager = userManager; } /// @@ -61,16 +67,24 @@ public class MediaInfoController : BaseJellyfinApiController /// The item id. /// The user id. /// Playback info returned. + /// Item not found. /// A containing a with the playback information. [HttpGet("Items/{itemId}/PlaybackInfo")] [ProducesResponseType(StatusCodes.Status200OK)] + [ProducesResponseType(StatusCodes.Status404NotFound)] public async Task> GetPlaybackInfo([FromRoute, Required] Guid itemId, [FromQuery] Guid? userId) { userId = RequestHelpers.GetUserId(User, userId); - return await _mediaInfoHelper.GetPlaybackInfo( - itemId, - userId) - .ConfigureAwait(false); + var user = userId.IsNullOrEmpty() + ? null + : _userManager.GetUserById(userId.Value); + var item = _libraryManager.GetItemById(itemId, user); + if (item is null) + { + return NotFound(); + } + + return await _mediaInfoHelper.GetPlaybackInfo(item, user).ConfigureAwait(false); } /// @@ -97,9 +111,11 @@ public class MediaInfoController : BaseJellyfinApiController /// Whether to allow to copy the audio stream. Default: true. /// The playback info. /// Playback info returned. + /// Item not found. /// A containing a with the playback info. [HttpPost("Items/{itemId}/PlaybackInfo")] [ProducesResponseType(StatusCodes.Status200OK)] + [ProducesResponseType(StatusCodes.Status404NotFound)] public async Task> GetPostedPlaybackInfo( [FromRoute, Required] Guid itemId, [FromQuery, ParameterObsolete] Guid? userId, @@ -148,9 +164,19 @@ public class MediaInfoController : BaseJellyfinApiController allowVideoStreamCopy ??= playbackInfoDto?.AllowVideoStreamCopy ?? true; allowAudioStreamCopy ??= playbackInfoDto?.AllowAudioStreamCopy ?? true; + userId = RequestHelpers.GetUserId(User, userId); + var user = userId.IsNullOrEmpty() + ? null + : _userManager.GetUserById(userId.Value); + var item = _libraryManager.GetItemById(itemId, user); + if (item is null) + { + return NotFound(); + } + var info = await _mediaInfoHelper.GetPlaybackInfo( - itemId, - userId, + item, + user, mediaSourceId, liveStreamId) .ConfigureAwait(false); @@ -163,8 +189,6 @@ public class MediaInfoController : BaseJellyfinApiController if (profile is not null) { // set device specific data - var item = _libraryManager.GetItemById(itemId); - foreach (var mediaSource in info.MediaSources) { _mediaInfoHelper.SetDeviceSpecificData( -- cgit v1.2.3