DeviceAccessEntryPoint.cs 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  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 MediaBrowser.Controller.Devices;
  7. using MediaBrowser.Controller.Library;
  8. using MediaBrowser.Controller.Plugins;
  9. using MediaBrowser.Controller.Security;
  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 IAuthenticationRepository _authRepo;
  17. private readonly IDeviceManager _deviceManager;
  18. private readonly ISessionManager _sessionManager;
  19. public DeviceAccessEntryPoint(IUserManager userManager, IAuthenticationRepository authRepo, IDeviceManager deviceManager, ISessionManager sessionManager)
  20. {
  21. _userManager = userManager;
  22. _authRepo = authRepo;
  23. _deviceManager = deviceManager;
  24. _sessionManager = sessionManager;
  25. }
  26. public Task RunAsync()
  27. {
  28. _userManager.OnUserUpdated += OnUserUpdated;
  29. return Task.CompletedTask;
  30. }
  31. public void Dispose()
  32. {
  33. }
  34. private void OnUserUpdated(object? sender, GenericEventArgs<User> e)
  35. {
  36. var user = e.Argument;
  37. if (!user.HasPermission(PermissionKind.EnableAllDevices))
  38. {
  39. UpdateDeviceAccess(user);
  40. }
  41. }
  42. private void UpdateDeviceAccess(User user)
  43. {
  44. var existing = _authRepo.Get(new AuthenticationInfoQuery
  45. {
  46. UserId = user.Id
  47. }).Items;
  48. foreach (var authInfo in existing)
  49. {
  50. if (!string.IsNullOrEmpty(authInfo.DeviceId) && !_deviceManager.CanAccessDevice(user, authInfo.DeviceId))
  51. {
  52. _sessionManager.Logout(authInfo);
  53. }
  54. }
  55. }
  56. }
  57. }