DeviceAccessHost.cs 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. using System.Threading;
  2. using System.Threading.Tasks;
  3. using Jellyfin.Data;
  4. using Jellyfin.Data.Events;
  5. using Jellyfin.Data.Queries;
  6. using Jellyfin.Database.Implementations.Entities;
  7. using Jellyfin.Database.Implementations.Enums;
  8. using MediaBrowser.Controller.Devices;
  9. using MediaBrowser.Controller.Library;
  10. using MediaBrowser.Controller.Session;
  11. using Microsoft.Extensions.Hosting;
  12. namespace Jellyfin.Server.Implementations.Users;
  13. /// <summary>
  14. /// <see cref="IHostedService"/> responsible for managing user device permissions.
  15. /// </summary>
  16. public sealed class DeviceAccessHost : IHostedService
  17. {
  18. private readonly IUserManager _userManager;
  19. private readonly IDeviceManager _deviceManager;
  20. private readonly ISessionManager _sessionManager;
  21. /// <summary>
  22. /// Initializes a new instance of the <see cref="DeviceAccessHost"/> class.
  23. /// </summary>
  24. /// <param name="userManager">The <see cref="IUserManager"/>.</param>
  25. /// <param name="deviceManager">The <see cref="IDeviceManager"/>.</param>
  26. /// <param name="sessionManager">The <see cref="ISessionManager"/>.</param>
  27. public DeviceAccessHost(IUserManager userManager, IDeviceManager deviceManager, ISessionManager sessionManager)
  28. {
  29. _userManager = userManager;
  30. _deviceManager = deviceManager;
  31. _sessionManager = sessionManager;
  32. }
  33. /// <inheritdoc />
  34. public Task StartAsync(CancellationToken cancellationToken)
  35. {
  36. _userManager.OnUserUpdated += OnUserUpdated;
  37. return Task.CompletedTask;
  38. }
  39. /// <inheritdoc />
  40. public Task StopAsync(CancellationToken cancellationToken)
  41. {
  42. _userManager.OnUserUpdated -= OnUserUpdated;
  43. return Task.CompletedTask;
  44. }
  45. private async void OnUserUpdated(object? sender, GenericEventArgs<User> e)
  46. {
  47. var user = e.Argument;
  48. if (!user.HasPermission(PermissionKind.EnableAllDevices))
  49. {
  50. await UpdateDeviceAccess(user).ConfigureAwait(false);
  51. }
  52. }
  53. private async Task UpdateDeviceAccess(User user)
  54. {
  55. var existing = _deviceManager.GetDevices(new DeviceQuery
  56. {
  57. UserId = user.Id
  58. }).Items;
  59. foreach (var device in existing)
  60. {
  61. if (!string.IsNullOrEmpty(device.DeviceId) && !_deviceManager.CanAccessDevice(user, device.DeviceId))
  62. {
  63. await _sessionManager.Logout(device).ConfigureAwait(false);
  64. }
  65. }
  66. }
  67. }