| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105 | using System.Threading.Tasks;using Jellyfin.Api.Helpers;using Jellyfin.Data.Enums;using MediaBrowser.Common.Net;using MediaBrowser.Controller.Library;using MediaBrowser.Controller.SyncPlay;using Microsoft.AspNetCore.Authorization;using Microsoft.AspNetCore.Http;namespace Jellyfin.Api.Auth.SyncPlayAccessPolicy{    /// <summary>    /// Default authorization handler.    /// </summary>    public class SyncPlayAccessHandler : BaseAuthorizationHandler<SyncPlayAccessRequirement>    {        private readonly ISyncPlayManager _syncPlayManager;        private readonly IUserManager _userManager;        /// <summary>        /// Initializes a new instance of the <see cref="SyncPlayAccessHandler"/> class.        /// </summary>        /// <param name="syncPlayManager">Instance of the <see cref="ISyncPlayManager"/> interface.</param>        /// <param name="userManager">Instance of the <see cref="IUserManager"/> interface.</param>        /// <param name="networkManager">Instance of the <see cref="INetworkManager"/> interface.</param>        /// <param name="httpContextAccessor">Instance of the <see cref="IHttpContextAccessor"/> interface.</param>        public SyncPlayAccessHandler(            ISyncPlayManager syncPlayManager,            IUserManager userManager,            INetworkManager networkManager,            IHttpContextAccessor httpContextAccessor)            : base(userManager, networkManager, httpContextAccessor)        {            _syncPlayManager = syncPlayManager;            _userManager = userManager;        }        /// <inheritdoc />        protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, SyncPlayAccessRequirement requirement)        {            if (!ValidateClaims(context.User))            {                context.Fail();                return Task.CompletedTask;            }            var userId = ClaimHelpers.GetUserId(context.User);            var user = _userManager.GetUserById(userId!.Value);            if (requirement.RequiredAccess == SyncPlayAccessRequirementType.HasAccess)            {                if (user.SyncPlayAccess == SyncPlayUserAccessType.CreateAndJoinGroups                    || user.SyncPlayAccess == SyncPlayUserAccessType.JoinGroups                    || _syncPlayManager.IsUserActive(userId.Value))                {                    context.Succeed(requirement);                }                else                {                    context.Fail();                }            }            else if (requirement.RequiredAccess == SyncPlayAccessRequirementType.CreateGroup)            {                if (user.SyncPlayAccess == SyncPlayUserAccessType.CreateAndJoinGroups)                {                    context.Succeed(requirement);                }                else                {                    context.Fail();                }            }            else if (requirement.RequiredAccess == SyncPlayAccessRequirementType.JoinGroup)            {                if (user.SyncPlayAccess == SyncPlayUserAccessType.CreateAndJoinGroups                    || user.SyncPlayAccess == SyncPlayUserAccessType.JoinGroups)                {                    context.Succeed(requirement);                }                else                {                    context.Fail();                }            }            else if (requirement.RequiredAccess == SyncPlayAccessRequirementType.IsInGroup)            {                if (_syncPlayManager.IsUserActive(userId.Value))                {                    context.Succeed(requirement);                }                else                {                    context.Fail();                }            }            else            {                context.Fail();            }            return Task.CompletedTask;        }    }}
 |