mirror of
https://github.com/Jackett/Jackett.git
synced 2025-09-17 17:34:09 +02:00
@@ -8,11 +8,13 @@ using Jackett.Common.Utils;
|
|||||||
using Microsoft.AspNetCore.Authorization;
|
using Microsoft.AspNetCore.Authorization;
|
||||||
using Microsoft.AspNetCore.Mvc;
|
using Microsoft.AspNetCore.Mvc;
|
||||||
using Microsoft.AspNetCore.Mvc.Filters;
|
using Microsoft.AspNetCore.Mvc.Filters;
|
||||||
|
using Microsoft.AspNetCore.Routing;
|
||||||
using NLog;
|
using NLog;
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Diagnostics;
|
using System.Diagnostics;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
|
using System.Net;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using System.Xml.Linq;
|
using System.Xml.Linq;
|
||||||
@@ -42,8 +44,7 @@ namespace Jackett.Server.Controllers
|
|||||||
#endif
|
#endif
|
||||||
if (queryApiKey != validApiKey)
|
if (queryApiKey != validApiKey)
|
||||||
{
|
{
|
||||||
context.Result = new UnauthorizedResult();
|
context.Result = ResultsController.GetErrorActionResult(context.RouteData, HttpStatusCode.Unauthorized, 100, "Invalid API Key");
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -68,7 +69,7 @@ namespace Jackett.Server.Controllers
|
|||||||
if (!parameters.ContainsKey("indexerId"))
|
if (!parameters.ContainsKey("indexerId"))
|
||||||
{
|
{
|
||||||
indexerController.CurrentIndexer = null;
|
indexerController.CurrentIndexer = null;
|
||||||
context.Result = new UnauthorizedResult();
|
context.Result = ResultsController.GetErrorActionResult(context.RouteData, HttpStatusCode.NotFound, 200, "Indexer is not specified");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -76,7 +77,7 @@ namespace Jackett.Server.Controllers
|
|||||||
if (indexerId.IsNullOrEmptyOrWhitespace())
|
if (indexerId.IsNullOrEmptyOrWhitespace())
|
||||||
{
|
{
|
||||||
indexerController.CurrentIndexer = null;
|
indexerController.CurrentIndexer = null;
|
||||||
context.Result = new UnauthorizedResult();
|
context.Result = ResultsController.GetErrorActionResult(context.RouteData, HttpStatusCode.NotFound, 201, "Indexer is not specified (empty value)");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -86,14 +87,14 @@ namespace Jackett.Server.Controllers
|
|||||||
if (indexer == null)
|
if (indexer == null)
|
||||||
{
|
{
|
||||||
indexerController.CurrentIndexer = null;
|
indexerController.CurrentIndexer = null;
|
||||||
context.Result = new UnauthorizedResult();
|
context.Result = ResultsController.GetErrorActionResult(context.RouteData, HttpStatusCode.NotFound, 201, "Indexer is not supported");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!indexer.IsConfigured)
|
if (!indexer.IsConfigured)
|
||||||
{
|
{
|
||||||
indexerController.CurrentIndexer = null;
|
indexerController.CurrentIndexer = null;
|
||||||
context.Result = new UnauthorizedResult();
|
context.Result = ResultsController.GetErrorActionResult(context.RouteData, HttpStatusCode.NotFound, 201, "Indexer is not configured");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -127,7 +128,7 @@ namespace Jackett.Server.Controllers
|
|||||||
var converter = queryType.GetMethod("ToTorznabQuery", System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.Public);
|
var converter = queryType.GetMethod("ToTorznabQuery", System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.Public);
|
||||||
if (converter == null)
|
if (converter == null)
|
||||||
{
|
{
|
||||||
context.Result = new BadRequestResult();
|
context.Result = ResultsController.GetErrorActionResult(context.RouteData, HttpStatusCode.BadRequest, 900, "ToTorznabQuery() not found");
|
||||||
}
|
}
|
||||||
|
|
||||||
var converted = converter.Invoke(null, new object[] { query });
|
var converted = converter.Invoke(null, new object[] { query });
|
||||||
@@ -141,7 +142,9 @@ namespace Jackett.Server.Controllers
|
|||||||
|
|
||||||
if (!resultController.CurrentIndexer.CanHandleQuery(resultController.CurrentQuery))
|
if (!resultController.CurrentIndexer.CanHandleQuery(resultController.CurrentQuery))
|
||||||
{
|
{
|
||||||
context.Result = new BadRequestObjectResult($"{resultController.CurrentIndexer.ID} does not support the requested query. Please check the capabilities (t=caps) and make sure the search mode and categories are supported.");
|
context.Result = ResultsController.GetErrorActionResult(context.RouteData, HttpStatusCode.BadRequest, 201, $"{resultController.CurrentIndexer.ID} " +
|
||||||
|
$"does not support the requested query. Please check the capabilities (t=caps) and make sure the search mode and categories are supported.");
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -265,7 +268,7 @@ namespace Jackett.Server.Controllers
|
|||||||
return resultIndexer;
|
return resultIndexer;
|
||||||
}).ToList();
|
}).ToList();
|
||||||
|
|
||||||
manualResult.Results = tasks.Where(t => t.Status == TaskStatus.RanToCompletion).Where(t => t.Result.Releases.Count() > 0).SelectMany(t =>
|
manualResult.Results = tasks.Where(t => t.Status == TaskStatus.RanToCompletion).Where(t => t.Result.Releases.Any()).SelectMany(t =>
|
||||||
{
|
{
|
||||||
var searchResults = t.Result.Releases;
|
var searchResults = t.Result.Releases;
|
||||||
var indexer = t.Result.Indexer;
|
var indexer = t.Result.Indexer;
|
||||||
@@ -354,6 +357,8 @@ namespace Jackett.Server.Controllers
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
var result = await CurrentIndexer.ResultsForQuery(CurrentQuery);
|
var result = await CurrentIndexer.ResultsForQuery(CurrentQuery);
|
||||||
|
|
||||||
// Some trackers do not support multiple category filtering so filter the releases that match manually.
|
// Some trackers do not support multiple category filtering so filter the releases that match manually.
|
||||||
@@ -409,9 +414,20 @@ namespace Jackett.Server.Controllers
|
|||||||
|
|
||||||
return Content(xml, "application/rss+xml", Encoding.UTF8);
|
return Content(xml, "application/rss+xml", Encoding.UTF8);
|
||||||
}
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
logger.Error(ex);
|
||||||
|
return GetErrorXML(900, ex.ToString());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
[Route("[action]/{ignored?}")]
|
[Route("[action]/{ignored?}")]
|
||||||
public IActionResult GetErrorXML(int code, string description)
|
public IActionResult GetErrorXML(int code, string description)
|
||||||
|
{
|
||||||
|
return Content(CreateErrorXML(code, description), "application/xml", Encoding.UTF8);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static string CreateErrorXML(int code, string description)
|
||||||
{
|
{
|
||||||
var xdoc = new XDocument(
|
var xdoc = new XDocument(
|
||||||
new XDeclaration("1.0", "UTF-8", null),
|
new XDeclaration("1.0", "UTF-8", null),
|
||||||
@@ -420,9 +436,41 @@ namespace Jackett.Server.Controllers
|
|||||||
new XAttribute("description", description)
|
new XAttribute("description", description)
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
|
return xdoc.Declaration + Environment.NewLine + xdoc;
|
||||||
|
}
|
||||||
|
|
||||||
var xml = xdoc.Declaration.ToString() + Environment.NewLine + xdoc.ToString();
|
public static IActionResult GetErrorActionResult(RouteData routeData, HttpStatusCode status, int torznabCode, string description)
|
||||||
return Content(xml, "application/xml", Encoding.UTF8);
|
{
|
||||||
|
bool isTorznab = routeData.Values["action"].ToString().Equals("torznab", StringComparison.OrdinalIgnoreCase);
|
||||||
|
|
||||||
|
if (isTorznab)
|
||||||
|
{
|
||||||
|
ContentResult contentResult = new ContentResult
|
||||||
|
{
|
||||||
|
Content = CreateErrorXML(torznabCode, description),
|
||||||
|
ContentType = "application/xml",
|
||||||
|
StatusCode = 200
|
||||||
|
};
|
||||||
|
return contentResult;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
switch (status)
|
||||||
|
{
|
||||||
|
case HttpStatusCode.Unauthorized:
|
||||||
|
return new UnauthorizedResult();
|
||||||
|
case HttpStatusCode.NotFound:
|
||||||
|
return new NotFoundObjectResult(description);
|
||||||
|
case HttpStatusCode.BadRequest:
|
||||||
|
return new BadRequestObjectResult(description);
|
||||||
|
default:
|
||||||
|
return new ContentResult
|
||||||
|
{
|
||||||
|
Content = description,
|
||||||
|
StatusCode = (int)status
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
[Route("[action]/{ignored?}")]
|
[Route("[action]/{ignored?}")]
|
||||||
|
Reference in New Issue
Block a user