using System.Collections.Generic; using System.IO; using System.Linq; using MediaBrowser.Controller.Library; using MediaBrowser.Controller.Net; using MediaBrowser.Controller.Session; using MediaBrowser.Model; using MediaBrowser.Model.Plugins; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Routing; using Microsoft.Extensions.Logging; namespace Jellyfin.Plugin.SSO_Auth.Views; /// /// The sso views controller. /// [ApiController] [Route("[controller]")] public class SSOViewsController : ControllerBase { private readonly IUserManager _userManager; private readonly ISessionManager _sessionManager; private readonly IAuthorizationContext _authContext; private readonly ILogger _logger; /// /// Initializes a new instance of the class. /// /// Instance of the interface. /// Instance of the interface. /// Instance of the interface. /// Instance of the interface. public SSOViewsController(ILogger logger, ISessionManager sessionManager, IUserManager userManager, IAuthorizationContext authContext) { _sessionManager = sessionManager; _userManager = userManager; _authContext = authContext; _logger = logger; _logger.LogInformation("SSO Views Controller initialized"); } private ActionResult ServeView(string viewName) { IEnumerable pages = null; if (SSOPlugin.Instance == null) { return BadRequest("No plugin instance found"); } pages = SSOPlugin.Instance.GetViews(); if (pages == null) { return NotFound("Pages is null or empty"); } var view = pages.FirstOrDefault(pageInfo => pageInfo.Name == viewName, null); if (view == null) { return NotFound("No matching view found"); } #nullable enable Stream? stream = SSOPlugin.Instance.GetType().Assembly.GetManifestResourceStream(view.EmbeddedResourcePath); if (stream == null) { _logger.LogError("Failed to get resource {Resource}", view.EmbeddedResourcePath); return NotFound(); } #nullable disable return File(stream, MimeTypes.GetMimeType(view.EmbeddedResourcePath)); } /// /// Gets a html view. /// /// The name of the view / asset to fetch. /// The html view with the specified name. [HttpGet("{viewName}")] public ActionResult GetView([FromRoute] string viewName) { return ServeView(viewName); } }