< Summary - Jellyfin

Information
Class: Jellyfin.Api.Auth.SyncPlayAccessPolicy.SyncPlayAccessHandler
Assembly: Jellyfin.Api
File(s): /srv/git/jellyfin/Jellyfin.Api/Auth/SyncPlayAccessPolicy/SyncPlayAccessHandler.cs
Line coverage
84%
Covered lines: 21
Uncovered lines: 4
Coverable lines: 25
Total lines: 77
Line coverage: 84%
Branch coverage
50%
Covered branches: 12
Total branches: 24
Branch coverage: 50%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Coverage history

Coverage history 0 25 50 75 100 3/26/2026 - 12:14:14 AM Line coverage: 24% (6/25) Branch coverage: 0% (0/24) Total lines: 777/3/2026 - 12:15:32 AM Line coverage: 84% (21/25) Branch coverage: 50% (12/24) Total lines: 77 3/26/2026 - 12:14:14 AM Line coverage: 24% (6/25) Branch coverage: 0% (0/24) Total lines: 777/3/2026 - 12:15:32 AM Line coverage: 84% (21/25) Branch coverage: 50% (12/24) Total lines: 77

Coverage delta

Coverage delta 60 -60

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor(...)100%11100%
HandleRequirementAsync(...)50%292478.94%

File(s)

/srv/git/jellyfin/Jellyfin.Api/Auth/SyncPlayAccessPolicy/SyncPlayAccessHandler.cs

#LineLine coverage
 1using System.Threading.Tasks;
 2using Jellyfin.Api.Extensions;
 3using Jellyfin.Data.Enums;
 4using Jellyfin.Database.Implementations.Enums;
 5using MediaBrowser.Common.Extensions;
 6using MediaBrowser.Controller.Library;
 7using MediaBrowser.Controller.SyncPlay;
 8using Microsoft.AspNetCore.Authorization;
 9
 10namespace Jellyfin.Api.Auth.SyncPlayAccessPolicy
 11{
 12    /// <summary>
 13    /// Default authorization handler.
 14    /// </summary>
 15    public class SyncPlayAccessHandler : AuthorizationHandler<SyncPlayAccessRequirement>
 16    {
 17        private readonly ISyncPlayManager _syncPlayManager;
 18        private readonly IUserManager _userManager;
 19
 20        /// <summary>
 21        /// Initializes a new instance of the <see cref="SyncPlayAccessHandler"/> class.
 22        /// </summary>
 23        /// <param name="syncPlayManager">Instance of the <see cref="ISyncPlayManager"/> interface.</param>
 24        /// <param name="userManager">Instance of the <see cref="IUserManager"/> interface.</param>
 1725        public SyncPlayAccessHandler(
 1726            ISyncPlayManager syncPlayManager,
 1727            IUserManager userManager)
 28        {
 1729            _syncPlayManager = syncPlayManager;
 1730            _userManager = userManager;
 1731        }
 32
 33        /// <inheritdoc />
 34        protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, SyncPlayAccessRequirement re
 35        {
 4636            var userId = context.User.GetUserId();
 4637            var user = _userManager.GetUserById(userId);
 4638            if (user is null)
 39            {
 040                throw new ResourceNotFoundException();
 41            }
 42
 4643            if (requirement.RequiredAccess == SyncPlayAccessRequirementType.HasAccess)
 44            {
 2345                if (user.SyncPlayAccess is SyncPlayUserAccessType.CreateAndJoinGroups or SyncPlayUserAccessType.JoinGrou
 2346                    || _syncPlayManager.IsUserActive(userId))
 47                {
 2348                    context.Succeed(requirement);
 49                }
 50            }
 2351            else if (requirement.RequiredAccess == SyncPlayAccessRequirementType.CreateGroup)
 52            {
 153                if (user.SyncPlayAccess == SyncPlayUserAccessType.CreateAndJoinGroups)
 54                {
 155                    context.Succeed(requirement);
 56                }
 57            }
 2258            else if (requirement.RequiredAccess == SyncPlayAccessRequirementType.JoinGroup)
 59            {
 2260                if (user.SyncPlayAccess == SyncPlayUserAccessType.CreateAndJoinGroups
 2261                    || user.SyncPlayAccess == SyncPlayUserAccessType.JoinGroups)
 62                {
 2263                    context.Succeed(requirement);
 64                }
 65            }
 066            else if (requirement.RequiredAccess == SyncPlayAccessRequirementType.IsInGroup)
 67            {
 068                if (_syncPlayManager.IsUserActive(userId))
 69                {
 070                    context.Succeed(requirement);
 71                }
 72            }
 73
 4674            return Task.CompletedTask;
 75        }
 76    }
 77}