using System; using System.Net; using System.Threading.Tasks; using API.Controllers; using API.Data; using API.Services; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.Filters; using Microsoft.Extensions.Logging; namespace API.Middleware; /// /// Middleware that checks if Opds has been enabled for this server, and sets OpdsController.UserId in HttpContext /// [AttributeUsage(AttributeTargets.Class)] public class OpdsActionFilterAttribute(IUnitOfWork unitOfWork, ILocalizationService localizationService, ILogger logger): ActionFilterAttribute { public override async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next) { int userId; try { if (!context.ActionArguments.TryGetValue("apiKey", out var apiKeyObj) || apiKeyObj is not string apiKey) { context.Result = new BadRequestResult(); return; } userId = await unitOfWork.UserRepository.GetUserIdByApiKeyAsync(apiKey); if (userId == null || userId == 0) { context.Result = new UnauthorizedResult(); return; } var settings = await unitOfWork.SettingsRepository.GetSettingsDtoAsync(); if (!settings.EnableOpds) { context.Result = new ContentResult { Content = await localizationService.Translate(userId, "opds-disabled"), ContentType = "text/plain", StatusCode = (int)HttpStatusCode.BadRequest, }; return; } } catch (Exception ex) { logger.LogError(ex, "failed to handle OPDS request"); context.Result = new BadRequestResult(); return; } // Add the UserId from ApiKey onto the OPDSController context.HttpContext.Items.Add(OpdsController.UserId, userId); await next(); } }