using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Net.Mime; using System.Text.RegularExpressions; using System.Threading.Tasks; using IdentityModel.OidcClient; using Jellyfin.Data.Entities; using Jellyfin.Data.Enums; using Jellyfin.Plugin.SSO_Auth; using Jellyfin.Plugin.SSO_Auth.Config; using Jellyfin.Plugin.SSO_Auth.Helpers; using MediaBrowser.Controller.Authentication; using MediaBrowser.Controller.Library; using MediaBrowser.Controller.Net; using MediaBrowser.Controller.Session; using MediaBrowser.Model; using MediaBrowser.Model.Plugins; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.ViewEngines; using Microsoft.AspNetCore.Routing; using Microsoft.Extensions.Logging; using Newtonsoft.Json; using Newtonsoft.Json.Linq; 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 the html view for the linking interface. /// /// The html view for the linking interface. // [Authorize(Policy = "DefaultAuthorization")] [HttpGet("linking")] public ActionResult GetLinkingView() { return ServeView("SSO-Auth-linking"); } /// /// Returns the client code for the linking view. /// /// The html view for the linking interface. // [Authorize(Policy = "DefaultAuthorization")] [HttpGet("linking.js")] public ActionResult GetLinkingJS() { return ServeView("SSO-Auth-linking.js"); } /// /// Get the shared js module that initializes the ApiClient. /// /// Returns the shared js module that initializes the ApiClient. // [Authorize(Policy = "DefaultAuthorization")] [HttpGet("ApiClient.js")] public ActionResult GetApiClientView() { return ServeView("SSO-Auth-ApiClient.js"); } /// /// Returns the css that is usually a part of the default view. /// /// A stylesheet. // [Authorize(Policy = "DefaultAuthorization")] [HttpGet("emby-restyle.css")] public ActionResult GetRestyledEmbyElements() { return ServeView("SSO-Auth-emby-restyle.css"); } }