using System.Threading.Tasks; using MediaBrowser.Common.Net; using MediaBrowser.Controller.Library; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Http; namespace Jellyfin.Api.Auth.LocalNetworkAccessPolicy { /// /// Local access handler. /// public class LocalNetworkAccessHandler : BaseAuthorizationHandler { /// /// Initializes a new instance of the class. /// /// Instance of the interface. /// Instance of the interface. /// Instance of the interface. public LocalNetworkAccessHandler( IUserManager userManager, INetworkManager networkManager, IHttpContextAccessor httpContextAccessor) : base(userManager, networkManager, httpContextAccessor) { } /// protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, LocalNetworkAccessRequirement requirement) { var ip = HttpContextAccessor.HttpContext?.Connection.RemoteIpAddress; // Loopback will be on LAN, so we can accept null. if (ip == null || NetworkManager.IsInLocalNetwork(ip)) { context.Succeed(requirement); } else { context.Fail(); } return Task.CompletedTask; } } }