blob: bad11a9257be5ad6a624d2f35acefaffc169617e (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
|
using System.Threading.Tasks;
using Jellyfin.Api.Controllers;
using Jellyfin.Api.Models.StartupDtos;
using Jellyfin.Database.Implementations.Entities;
using Jellyfin.Server.Implementations.Users;
using MediaBrowser.Controller.Configuration;
using MediaBrowser.Controller.Library;
using Microsoft.AspNetCore.Mvc;
using Moq;
using Xunit;
namespace Jellyfin.Api.Tests.Controllers;
public class StartupControllerTests
{
private readonly StartupController _subject;
private readonly Mock<IUserManager> _mockUserManager;
private readonly Mock<IServerConfigurationManager> _mockConfig;
public StartupControllerTests()
{
_mockUserManager = new Mock<IUserManager>();
_mockConfig = new Mock<IServerConfigurationManager>();
_subject = new StartupController(_mockConfig.Object, _mockUserManager.Object);
}
private static User CreateUser()
=> new User(
"jellyfin",
typeof(DefaultAuthenticationProvider).FullName!,
typeof(DefaultPasswordResetProvider).FullName!);
[Fact]
public async Task UpdateStartupUser_WhenNoUserExists_ReturnsNotFound()
{
_mockUserManager.Setup(m => m.GetFirstUser()).Returns((User?)null);
var result = await _subject.UpdateStartupUser(new StartupUserDto { Name = "admin", Password = "pw" });
Assert.IsType<NotFoundResult>(result);
}
[Fact]
public async Task UpdateStartupUser_WhenPasswordAlreadyConfigured_ReturnsForbidden()
{
var user = CreateUser();
user.Password = "already-set-hash";
_mockUserManager.Setup(m => m.GetFirstUser()).Returns(user);
var result = await _subject.UpdateStartupUser(new StartupUserDto { Name = "attacker", Password = "new-pw" });
// The startup wizard must never overwrite the password of an already-provisioned
// account, even if IsStartupWizardCompleted has been cleared.
Assert.IsType<ForbidResult>(result);
_mockUserManager.Verify(m => m.ChangePassword(It.IsAny<System.Guid>(), It.IsAny<string>()), Times.Never);
}
[Fact]
public async Task UpdateStartupUser_WhenNoPasswordYet_SetsPassword()
{
var user = CreateUser();
Assert.True(string.IsNullOrEmpty(user.Password));
_mockUserManager.Setup(m => m.GetFirstUser()).Returns(user);
var result = await _subject.UpdateStartupUser(new StartupUserDto { Name = "jellyfin", Password = "first-pw" });
Assert.IsType<NoContentResult>(result);
_mockUserManager.Verify(m => m.ChangePassword(user.Id, "first-pw"), Times.Once);
}
}
|