aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBond-009 <bond.009@outlook.com>2024-02-05 16:11:18 +0100
committerGitHub <noreply@github.com>2024-02-05 16:11:18 +0100
commit83a478c4480a5f8f36b0b0bf616b91504f8b6a40 (patch)
treee51f7a78f855e784235bb0501f9a6e9e3353761d
parentc372c7440f2ee69e9a8f4841d3418d250f138472 (diff)
parentd82d025b248cbd8eee8372dfc08940d53675d4ee (diff)
Merge pull request #10956 from beakerandjake/GetLogFile-return-404
Fix InvalidOperationException if log file not found
-rw-r--r--Jellyfin.Api/Controllers/SystemController.cs12
-rw-r--r--tests/Jellyfin.Api.Tests/Controllers/SystemControllerTests.cs35
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);
+ }
+ }
+}