DeviceAccessHost.cs 2.4 KB

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