Fixed: (Redacted) Use Api Key for downloading

pull/3600/head
Bogdan 2 years ago
parent 45329f29bd
commit 3b0289e3ec

@ -22,7 +22,7 @@ namespace NzbDrone.Core.Test.IndexerTests.RedactedTests
Name = "Redacted", Name = "Redacted",
Settings = new RedactedSettings Settings = new RedactedSettings
{ {
ApiKey = "key" ApiKey = "secretkey"
} }
}; };
} }
@ -31,7 +31,6 @@ namespace NzbDrone.Core.Test.IndexerTests.RedactedTests
public void should_parse_recent_feed_from_redacted() public void should_parse_recent_feed_from_redacted()
{ {
var recentFeed = ReadAllText(@"Files/Indexers/Gazelle/Gazelle.json"); var recentFeed = ReadAllText(@"Files/Indexers/Gazelle/Gazelle.json");
var indexFeed = ReadAllText(@"Files/Indexers/Gazelle/GazelleIndex.json");
Mocker.GetMock<IHttpClient>() Mocker.GetMock<IHttpClient>()
.Setup(o => o.Execute(It.Is<HttpRequest>(v => v.Method == HttpMethod.Get && .Setup(o => o.Execute(It.Is<HttpRequest>(v => v.Method == HttpMethod.Get &&
@ -39,13 +38,6 @@ namespace NzbDrone.Core.Test.IndexerTests.RedactedTests
v.Headers.Get("Authorization") == ((RedactedSettings)Subject.Definition.Settings).ApiKey))) v.Headers.Get("Authorization") == ((RedactedSettings)Subject.Definition.Settings).ApiKey)))
.Returns<HttpRequest>(r => new HttpResponse(r, new HttpHeader { ContentType = "application/json" }, recentFeed)); .Returns<HttpRequest>(r => new HttpResponse(r, new HttpHeader { ContentType = "application/json" }, recentFeed));
Mocker.GetMock<IHttpClient>()
.Setup(o => o.Execute(It.Is<HttpRequest>(v => v.Method == HttpMethod.Get &&
v.Url.FullUri.Contains("ajax.php?action=index") &&
v.Headers.Get("Authorization") == ((RedactedSettings)Subject.Definition.Settings).ApiKey)))
.Returns<HttpRequest>(r => new HttpResponse(r, new HttpHeader(), indexFeed));
((RedactedRequestGenerator)Subject.GetRequestGenerator()).Authenticate();
var releases = Subject.FetchRecent(); var releases = Subject.FetchRecent();
releases.Should().HaveCount(4); releases.Should().HaveCount(4);
@ -54,8 +46,7 @@ namespace NzbDrone.Core.Test.IndexerTests.RedactedTests
releaseInfo.Title.Should().Be("Shania Twain - Shania Twain (1993) [FLAC 24bit Lossless] [WEB]"); releaseInfo.Title.Should().Be("Shania Twain - Shania Twain (1993) [FLAC 24bit Lossless] [WEB]");
releaseInfo.DownloadProtocol.Should().Be(DownloadProtocol.Torrent); releaseInfo.DownloadProtocol.Should().Be(DownloadProtocol.Torrent);
releaseInfo.DownloadUrl.Should() releaseInfo.DownloadUrl.Should().Be("https://redacted.ch/ajax.php?action=download&id=1541452&usetoken=0");
.Be("https://redacted.ch/torrents.php?action=download&id=1541452&authkey=lidarr&torrent_pass=redacted&usetoken=0");
releaseInfo.InfoUrl.Should().Be("https://redacted.ch/torrents.php?id=106951&torrentid=1541452"); releaseInfo.InfoUrl.Should().Be("https://redacted.ch/torrents.php?id=106951&torrentid=1541452");
releaseInfo.CommentUrl.Should().Be(null); releaseInfo.CommentUrl.Should().Be(null);
releaseInfo.Indexer.Should().Be(Subject.Definition.Name); releaseInfo.Indexer.Should().Be(Subject.Definition.Name);

@ -1,5 +1,3 @@
using System.Collections.Generic;
using FluentValidation.Results;
using NLog; using NLog;
using NzbDrone.Common.Http; using NzbDrone.Common.Http;
using NzbDrone.Core.Configuration; using NzbDrone.Core.Configuration;
@ -26,7 +24,7 @@ namespace NzbDrone.Core.Indexers.Redacted
public override IIndexerRequestGenerator GetRequestGenerator() public override IIndexerRequestGenerator GetRequestGenerator()
{ {
return new RedactedRequestGenerator(Settings, _httpClient, _logger); return new RedactedRequestGenerator(Settings);
} }
public override IParseIndexerResponse GetParser() public override IParseIndexerResponse GetParser()
@ -34,11 +32,12 @@ namespace NzbDrone.Core.Indexers.Redacted
return new RedactedParser(Settings); return new RedactedParser(Settings);
} }
protected override void Test(List<ValidationFailure> failures) public override HttpRequest GetDownloadRequest(string link)
{ {
((RedactedRequestGenerator)GetRequestGenerator()).Authenticate(); var request = new HttpRequest(link);
request.Headers.Set("Authorization", Settings.ApiKey);
base.Test(failures); return request;
} }
} }
} }

@ -67,7 +67,7 @@ namespace NzbDrone.Core.Indexers.Redacted
Container = torrent.Encoding, Container = torrent.Encoding,
Codec = torrent.Format, Codec = torrent.Format,
Size = long.Parse(torrent.Size), Size = long.Parse(torrent.Size),
DownloadUrl = GetDownloadUrl(id), DownloadUrl = GetDownloadUrl(id, torrent.CanUseToken),
InfoUrl = GetInfoUrl(result.GroupId, id), InfoUrl = GetInfoUrl(result.GroupId, id),
Seeders = int.Parse(torrent.Seeders), Seeders = int.Parse(torrent.Seeders),
Peers = int.Parse(torrent.Leechers) + int.Parse(torrent.Seeders), Peers = int.Parse(torrent.Leechers) + int.Parse(torrent.Seeders),
@ -85,17 +85,13 @@ namespace NzbDrone.Core.Indexers.Redacted
.ToArray(); .ToArray();
} }
private string GetDownloadUrl(int torrentId) private string GetDownloadUrl(int torrentId, bool canUseToken)
{ {
// AuthKey is required but not checked, just pass in a dummy variable
// to avoid having to track authkey, which is randomly cycled
var url = new HttpUri(_settings.BaseUrl) var url = new HttpUri(_settings.BaseUrl)
.CombinePath("/torrents.php") .CombinePath("/ajax.php")
.AddQueryParam("action", "download") .AddQueryParam("action", "download")
.AddQueryParam("id", torrentId) .AddQueryParam("id", torrentId)
.AddQueryParam("authkey", "lidarr") .AddQueryParam("usetoken", _settings.UseFreeleechToken && canUseToken ? 1 : 0);
.AddQueryParam("torrent_pass", _settings.PassKey)
.AddQueryParam("usetoken", _settings.UseFreeleechToken ? 1 : 0);
return url.FullUri; return url.FullUri;
} }

@ -1,10 +1,5 @@
using System;
using System.Collections.Generic; using System.Collections.Generic;
using NLog;
using NzbDrone.Common.Extensions;
using NzbDrone.Common.Http; using NzbDrone.Common.Http;
using NzbDrone.Common.Serializer;
using NzbDrone.Core.Indexers.Gazelle;
using NzbDrone.Core.IndexerSearch.Definitions; using NzbDrone.Core.IndexerSearch.Definitions;
namespace NzbDrone.Core.Indexers.Redacted namespace NzbDrone.Core.Indexers.Redacted
@ -12,14 +7,10 @@ namespace NzbDrone.Core.Indexers.Redacted
public class RedactedRequestGenerator : IIndexerRequestGenerator public class RedactedRequestGenerator : IIndexerRequestGenerator
{ {
private readonly RedactedSettings _settings; private readonly RedactedSettings _settings;
private readonly IHttpClient _httpClient;
private readonly Logger _logger;
public RedactedRequestGenerator(RedactedSettings settings, IHttpClient httpClient, Logger logger) public RedactedRequestGenerator(RedactedSettings settings)
{ {
_settings = settings; _settings = settings;
_httpClient = httpClient;
_logger = logger;
} }
public virtual IndexerPageableRequestChain GetRecentRequests() public virtual IndexerPageableRequestChain GetRecentRequests()
@ -54,24 +45,6 @@ namespace NzbDrone.Core.Indexers.Redacted
return pageableRequests; return pageableRequests;
} }
public void Authenticate()
{
var index = GetIndex();
if (index == null ||
index.Status.IsNullOrWhiteSpace() ||
index.Status != "success" ||
index.Response.Passkey.IsNullOrWhiteSpace())
{
_logger.Debug("Redacted authentication failed.");
throw new Exception("Failed to authenticate with Redacted.");
}
_logger.Debug("Redacted authentication succeeded.");
_settings.PassKey = index.Response.Passkey;
}
private IEnumerable<IndexerRequest> GetRequest(string searchParameters) private IEnumerable<IndexerRequest> GetRequest(string searchParameters)
{ {
var req = RequestBuilder() var req = RequestBuilder()
@ -81,17 +54,6 @@ namespace NzbDrone.Core.Indexers.Redacted
yield return new IndexerRequest(req); yield return new IndexerRequest(req);
} }
private GazelleAuthResponse GetIndex()
{
var request = RequestBuilder().Resource("ajax.php?action=index").Build();
var indexResponse = _httpClient.Execute(request);
var result = Json.Deserialize<GazelleAuthResponse>(indexResponse.Content);
return result;
}
private HttpRequestBuilder RequestBuilder() private HttpRequestBuilder RequestBuilder()
{ {
return new HttpRequestBuilder($"{_settings.BaseUrl.Trim().TrimEnd('/')}") return new HttpRequestBuilder($"{_settings.BaseUrl.Trim().TrimEnd('/')}")

@ -27,19 +27,16 @@ namespace NzbDrone.Core.Indexers.Redacted
[FieldDefinition(1, Label = "ApiKey", HelpText = "Generate this in 'Access Settings' in your Redacted profile", Privacy = PrivacyLevel.ApiKey)] [FieldDefinition(1, Label = "ApiKey", HelpText = "Generate this in 'Access Settings' in your Redacted profile", Privacy = PrivacyLevel.ApiKey)]
public string ApiKey { get; set; } public string ApiKey { get; set; }
[FieldDefinition(1, Hidden = HiddenType.Hidden)] [FieldDefinition(2, Type = FieldType.Textbox, Label = "Minimum Seeders", HelpText = "Minimum number of seeders required.", Advanced = true)]
public string PassKey { get; set; }
[FieldDefinition(3, Type = FieldType.Textbox, Label = "Minimum Seeders", HelpText = "Minimum number of seeders required.", Advanced = true)]
public int MinimumSeeders { get; set; } public int MinimumSeeders { get; set; }
[FieldDefinition(4)] [FieldDefinition(3)]
public SeedCriteriaSettings SeedCriteria { get; set; } = new (); public SeedCriteriaSettings SeedCriteria { get; set; } = new ();
[FieldDefinition(5, Type = FieldType.Number, Label = "Early Download Limit", Unit = "days", HelpText = "Time before release date Lidarr will download from this indexer, empty is no limit", Advanced = true)] [FieldDefinition(4, Type = FieldType.Number, Label = "Early Download Limit", Unit = "days", HelpText = "Time before release date Lidarr will download from this indexer, empty is no limit", Advanced = true)]
public int? EarlyReleaseLimit { get; set; } public int? EarlyReleaseLimit { get; set; }
[FieldDefinition(6, Type = FieldType.Checkbox, Label = "Use Freeleech Token", HelpText = "Will cause grabbing to fail if you do not have any tokens available", Advanced = true)] [FieldDefinition(5, Type = FieldType.Checkbox, Label = "Use Freeleech Token", HelpText = "Will cause grabbing to fail if you do not have any tokens available", Advanced = true)]
public bool UseFreeleechToken { get; set; } public bool UseFreeleechToken { get; set; }
public NzbDroneValidationResult Validate() public NzbDroneValidationResult Validate()

Loading…
Cancel
Save