diff options
| author | Bond-009 <bond.009@outlook.com> | 2024-02-05 16:11:18 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-02-05 16:11:18 +0100 |
| commit | 83a478c4480a5f8f36b0b0bf616b91504f8b6a40 (patch) | |
| tree | e51f7a78f855e784235bb0501f9a6e9e3353761d | |
| parent | c372c7440f2ee69e9a8f4841d3418d250f138472 (diff) | |
| parent | d82d025b248cbd8eee8372dfc08940d53675d4ee (diff) | |
Merge pull request #10956 from beakerandjake/GetLogFile-return-404
Fix InvalidOperationException if log file not found
| -rw-r--r-- | Jellyfin.Api/Controllers/SystemController.cs | 12 | ||||
| -rw-r--r-- | tests/Jellyfin.Api.Tests/Controllers/SystemControllerTests.cs | 35 |
2 files changed, 45 insertions, 2 deletions
diff --git a/Jellyfin.Api/Controllers/SystemController.cs b/Jellyfin.Api/Controllers/SystemController.cs index 3d4df0386..6c5ce4715 100644 --- a/Jellyfin.Api/Controllers/SystemController.cs +++ b/Jellyfin.Api/Controllers/SystemController.cs @@ -188,16 +188,24 @@ public class SystemController : BaseJellyfinApiController /// <param name="name">The name of the log file to get.</param> /// <response code="200">Log file retrieved.</response> /// <response code="403">User does not have permission to get log files.</response> + /// <response code="404">Could not find a log file with the name.</response> /// <returns>The log file.</returns> [HttpGet("Logs/Log")] [Authorize(Policy = Policies.RequiresElevation)] [ProducesResponseType(StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status403Forbidden)] + [ProducesResponseType(StatusCodes.Status404NotFound)] [ProducesFile(MediaTypeNames.Text.Plain)] public ActionResult GetLogFile([FromQuery, Required] string name) { - var file = _fileSystem.GetFiles(_appPaths.LogDirectoryPath) - .First(i => string.Equals(i.Name, name, StringComparison.OrdinalIgnoreCase)); + var file = _fileSystem + .GetFiles(_appPaths.LogDirectoryPath) + .FirstOrDefault(i => string.Equals(i.Name, name, StringComparison.OrdinalIgnoreCase)); + + if (file is null) + { + return NotFound("Log file not found."); + } // For older files, assume fully static var fileShare = file.LastWriteTimeUtc < DateTime.UtcNow.AddHours(-1) ? FileShare.Read : FileShare.ReadWrite; diff --git a/tests/Jellyfin.Api.Tests/Controllers/SystemControllerTests.cs b/tests/Jellyfin.Api.Tests/Controllers/SystemControllerTests.cs new file mode 100644 index 000000000..dd84c1a18 --- /dev/null +++ b/tests/Jellyfin.Api.Tests/Controllers/SystemControllerTests.cs @@ -0,0 +1,35 @@ +using Jellyfin.Api.Controllers; +using MediaBrowser.Common.Net; +using MediaBrowser.Controller; +using MediaBrowser.Model.IO; +using Microsoft.AspNetCore.Mvc; +using Microsoft.Extensions.Logging; +using Moq; +using Xunit; + +namespace Jellyfin.Api.Tests.Controllers +{ + public class SystemControllerTests + { + [Fact] + public void GetLogFile_FileDoesNotExist_ReturnsNotFound() + { + var mockFileSystem = new Mock<IFileSystem>(); + mockFileSystem + .Setup(fs => fs.GetFiles(It.IsAny<string>(), It.IsAny<bool>())) + .Returns([new() { Name = "file1.txt" }, new() { Name = "file2.txt" }]); + + var controller = new SystemController( + Mock.Of<ILogger<SystemController>>(), + Mock.Of<IServerApplicationHost>(), + Mock.Of<IServerApplicationPaths>(), + mockFileSystem.Object, + Mock.Of<INetworkManager>(), + Mock.Of<ISystemManager>()); + + var result = controller.GetLogFile("DOES_NOT_EXIST.txt"); + + Assert.IsType<NotFoundObjectResult>(result); + } + } +} |
