DeviceAccessEntryPoint.cs 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. #pragma warning disable CS1591
  2. using System.Threading.Tasks;
  3. using Jellyfin.Data.Enums;
  4. using MediaBrowser.Controller.Devices;
  5. using MediaBrowser.Controller.Library;
  6. using MediaBrowser.Controller.Plugins;
  7. using MediaBrowser.Controller.Security;
  8. using MediaBrowser.Controller.Session;
  9. using MediaBrowser.Model.Events;
  10. namespace Jellyfin.Server.Implementations.User
  11. {
  12. public sealed class DeviceAccessEntryPoint : IServerEntryPoint
  13. {
  14. private readonly IUserManager _userManager;
  15. private readonly IAuthenticationRepository _authRepo;
  16. private readonly IDeviceManager _deviceManager;
  17. private readonly ISessionManager _sessionManager;
  18. public DeviceAccessEntryPoint(IUserManager userManager, IAuthenticationRepository authRepo, IDeviceManager deviceManager, ISessionManager sessionManager)
  19. {
  20. _userManager = userManager;
  21. _authRepo = authRepo;
  22. _deviceManager = deviceManager;
  23. _sessionManager = sessionManager;
  24. }
  25. public Task RunAsync()
  26. {
  27. _userManager.OnUserUpdated += OnUserUpdated;
  28. return Task.CompletedTask;
  29. }
  30. private void OnUserUpdated(object sender, GenericEventArgs<Data.Entities.User> e)
  31. {
  32. var user = e.Argument;
  33. if (!user.HasPermission(PermissionKind.EnableAllDevices))
  34. {
  35. UpdateDeviceAccess(user);
  36. }
  37. }
  38. public void Dispose()
  39. {
  40. }
  41. private void UpdateDeviceAccess(Data.Entities.User user)
  42. {
  43. var existing = _authRepo.Get(new AuthenticationInfoQuery
  44. {
  45. UserId = user.Id
  46. }).Items;
  47. foreach (var authInfo in existing)
  48. {
  49. if (!string.IsNullOrEmpty(authInfo.DeviceId) && !_deviceManager.CanAccessDevice(user, authInfo.DeviceId))
  50. {
  51. _sessionManager.Logout(authInfo);
  52. }
  53. }
  54. }
  55. }
  56. }