DeviceAccessEntryPoint.cs 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. #pragma warning disable CS1591
  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.Plugins;
  10. using MediaBrowser.Controller.Session;
  11. namespace Jellyfin.Server.Implementations.Users
  12. {
  13. public sealed class DeviceAccessEntryPoint : IServerEntryPoint
  14. {
  15. private readonly IUserManager _userManager;
  16. private readonly IDeviceManager _deviceManager;
  17. private readonly ISessionManager _sessionManager;
  18. public DeviceAccessEntryPoint(IUserManager userManager, IDeviceManager deviceManager, ISessionManager sessionManager)
  19. {
  20. _userManager = userManager;
  21. _deviceManager = deviceManager;
  22. _sessionManager = sessionManager;
  23. }
  24. public Task RunAsync()
  25. {
  26. _userManager.OnUserUpdated += OnUserUpdated;
  27. return Task.CompletedTask;
  28. }
  29. public void Dispose()
  30. {
  31. }
  32. private async void OnUserUpdated(object? sender, GenericEventArgs<User> e)
  33. {
  34. var user = e.Argument;
  35. if (!user.HasPermission(PermissionKind.EnableAllDevices))
  36. {
  37. await UpdateDeviceAccess(user).ConfigureAwait(false);
  38. }
  39. }
  40. private async Task UpdateDeviceAccess(User user)
  41. {
  42. var existing = (await _deviceManager.GetDevices(new DeviceQuery
  43. {
  44. UserId = user.Id
  45. }).ConfigureAwait(false)).Items;
  46. foreach (var device in existing)
  47. {
  48. if (!string.IsNullOrEmpty(device.DeviceId) && !_deviceManager.CanAccessDevice(user, device.DeviceId))
  49. {
  50. await _sessionManager.Logout(device).ConfigureAwait(false);
  51. }
  52. }
  53. }
  54. }
  55. }