SyncPlayAccessHandler.cs 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. using System.Threading.Tasks;
  2. using Jellyfin.Api.Extensions;
  3. using Jellyfin.Data.Enums;
  4. using MediaBrowser.Common.Extensions;
  5. using MediaBrowser.Controller.Library;
  6. using MediaBrowser.Controller.SyncPlay;
  7. using Microsoft.AspNetCore.Authorization;
  8. namespace Jellyfin.Api.Auth.SyncPlayAccessPolicy
  9. {
  10. /// <summary>
  11. /// Default authorization handler.
  12. /// </summary>
  13. public class SyncPlayAccessHandler : AuthorizationHandler<SyncPlayAccessRequirement>
  14. {
  15. private readonly ISyncPlayManager _syncPlayManager;
  16. private readonly IUserManager _userManager;
  17. /// <summary>
  18. /// Initializes a new instance of the <see cref="SyncPlayAccessHandler"/> class.
  19. /// </summary>
  20. /// <param name="syncPlayManager">Instance of the <see cref="ISyncPlayManager"/> interface.</param>
  21. /// <param name="userManager">Instance of the <see cref="IUserManager"/> interface.</param>
  22. public SyncPlayAccessHandler(
  23. ISyncPlayManager syncPlayManager,
  24. IUserManager userManager)
  25. {
  26. _syncPlayManager = syncPlayManager;
  27. _userManager = userManager;
  28. }
  29. /// <inheritdoc />
  30. protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, SyncPlayAccessRequirement requirement)
  31. {
  32. var userId = context.User.GetUserId();
  33. var user = _userManager.GetUserById(userId);
  34. if (user is null)
  35. {
  36. throw new ResourceNotFoundException();
  37. }
  38. if (requirement.RequiredAccess == SyncPlayAccessRequirementType.HasAccess)
  39. {
  40. if (user.SyncPlayAccess is SyncPlayUserAccessType.CreateAndJoinGroups or SyncPlayUserAccessType.JoinGroups
  41. || _syncPlayManager.IsUserActive(userId))
  42. {
  43. context.Succeed(requirement);
  44. }
  45. }
  46. else if (requirement.RequiredAccess == SyncPlayAccessRequirementType.CreateGroup)
  47. {
  48. if (user.SyncPlayAccess == SyncPlayUserAccessType.CreateAndJoinGroups)
  49. {
  50. context.Succeed(requirement);
  51. }
  52. }
  53. else if (requirement.RequiredAccess == SyncPlayAccessRequirementType.JoinGroup)
  54. {
  55. if (user.SyncPlayAccess == SyncPlayUserAccessType.CreateAndJoinGroups
  56. || user.SyncPlayAccess == SyncPlayUserAccessType.JoinGroups)
  57. {
  58. context.Succeed(requirement);
  59. }
  60. }
  61. else if (requirement.RequiredAccess == SyncPlayAccessRequirementType.IsInGroup)
  62. {
  63. if (_syncPlayManager.IsUserActive(userId))
  64. {
  65. context.Succeed(requirement);
  66. }
  67. }
  68. return Task.CompletedTask;
  69. }
  70. }
  71. }