From 3b0289e3ec500eb9a523d0ec09a3fab53ba2d81c Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sun, 30 Apr 2023 16:37:04 +0300 Subject: [PATCH] Fixed: (Redacted) Use Api Key for downloading --- .../RedactedTests/RedactedFixture.cs | 13 +----- .../Indexers/Redacted/Redacted.cs | 11 +++-- .../Indexers/Redacted/RedactedParser.cs | 12 ++---- .../Redacted/RedactedRequestGenerator.cs | 40 +------------------ .../Indexers/Redacted/RedactedSettings.cs | 11 ++--- 5 files changed, 16 insertions(+), 71 deletions(-) diff --git a/src/NzbDrone.Core.Test/IndexerTests/RedactedTests/RedactedFixture.cs b/src/NzbDrone.Core.Test/IndexerTests/RedactedTests/RedactedFixture.cs index 66f08ba78..c5afaead9 100644 --- a/src/NzbDrone.Core.Test/IndexerTests/RedactedTests/RedactedFixture.cs +++ b/src/NzbDrone.Core.Test/IndexerTests/RedactedTests/RedactedFixture.cs @@ -22,7 +22,7 @@ namespace NzbDrone.Core.Test.IndexerTests.RedactedTests Name = "Redacted", 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() { var recentFeed = ReadAllText(@"Files/Indexers/Gazelle/Gazelle.json"); - var indexFeed = ReadAllText(@"Files/Indexers/Gazelle/GazelleIndex.json"); Mocker.GetMock() .Setup(o => o.Execute(It.Is(v => v.Method == HttpMethod.Get && @@ -39,13 +38,6 @@ namespace NzbDrone.Core.Test.IndexerTests.RedactedTests v.Headers.Get("Authorization") == ((RedactedSettings)Subject.Definition.Settings).ApiKey))) .Returns(r => new HttpResponse(r, new HttpHeader { ContentType = "application/json" }, recentFeed)); - Mocker.GetMock() - .Setup(o => o.Execute(It.Is(v => v.Method == HttpMethod.Get && - v.Url.FullUri.Contains("ajax.php?action=index") && - v.Headers.Get("Authorization") == ((RedactedSettings)Subject.Definition.Settings).ApiKey))) - .Returns(r => new HttpResponse(r, new HttpHeader(), indexFeed)); - - ((RedactedRequestGenerator)Subject.GetRequestGenerator()).Authenticate(); var releases = Subject.FetchRecent(); 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.DownloadProtocol.Should().Be(DownloadProtocol.Torrent); - releaseInfo.DownloadUrl.Should() - .Be("https://redacted.ch/torrents.php?action=download&id=1541452&authkey=lidarr&torrent_pass=redacted&usetoken=0"); + releaseInfo.DownloadUrl.Should().Be("https://redacted.ch/ajax.php?action=download&id=1541452&usetoken=0"); releaseInfo.InfoUrl.Should().Be("https://redacted.ch/torrents.php?id=106951&torrentid=1541452"); releaseInfo.CommentUrl.Should().Be(null); releaseInfo.Indexer.Should().Be(Subject.Definition.Name); diff --git a/src/NzbDrone.Core/Indexers/Redacted/Redacted.cs b/src/NzbDrone.Core/Indexers/Redacted/Redacted.cs index 7725d6eaf..8cb5024a3 100644 --- a/src/NzbDrone.Core/Indexers/Redacted/Redacted.cs +++ b/src/NzbDrone.Core/Indexers/Redacted/Redacted.cs @@ -1,5 +1,3 @@ -using System.Collections.Generic; -using FluentValidation.Results; using NLog; using NzbDrone.Common.Http; using NzbDrone.Core.Configuration; @@ -26,7 +24,7 @@ namespace NzbDrone.Core.Indexers.Redacted public override IIndexerRequestGenerator GetRequestGenerator() { - return new RedactedRequestGenerator(Settings, _httpClient, _logger); + return new RedactedRequestGenerator(Settings); } public override IParseIndexerResponse GetParser() @@ -34,11 +32,12 @@ namespace NzbDrone.Core.Indexers.Redacted return new RedactedParser(Settings); } - protected override void Test(List 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; } } } diff --git a/src/NzbDrone.Core/Indexers/Redacted/RedactedParser.cs b/src/NzbDrone.Core/Indexers/Redacted/RedactedParser.cs index 36a602db1..a6a174a79 100644 --- a/src/NzbDrone.Core/Indexers/Redacted/RedactedParser.cs +++ b/src/NzbDrone.Core/Indexers/Redacted/RedactedParser.cs @@ -67,7 +67,7 @@ namespace NzbDrone.Core.Indexers.Redacted Container = torrent.Encoding, Codec = torrent.Format, Size = long.Parse(torrent.Size), - DownloadUrl = GetDownloadUrl(id), + DownloadUrl = GetDownloadUrl(id, torrent.CanUseToken), InfoUrl = GetInfoUrl(result.GroupId, id), Seeders = int.Parse(torrent.Seeders), Peers = int.Parse(torrent.Leechers) + int.Parse(torrent.Seeders), @@ -85,17 +85,13 @@ namespace NzbDrone.Core.Indexers.Redacted .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) - .CombinePath("/torrents.php") + .CombinePath("/ajax.php") .AddQueryParam("action", "download") .AddQueryParam("id", torrentId) - .AddQueryParam("authkey", "lidarr") - .AddQueryParam("torrent_pass", _settings.PassKey) - .AddQueryParam("usetoken", _settings.UseFreeleechToken ? 1 : 0); + .AddQueryParam("usetoken", _settings.UseFreeleechToken && canUseToken ? 1 : 0); return url.FullUri; } diff --git a/src/NzbDrone.Core/Indexers/Redacted/RedactedRequestGenerator.cs b/src/NzbDrone.Core/Indexers/Redacted/RedactedRequestGenerator.cs index 398db35a3..84d34c953 100644 --- a/src/NzbDrone.Core/Indexers/Redacted/RedactedRequestGenerator.cs +++ b/src/NzbDrone.Core/Indexers/Redacted/RedactedRequestGenerator.cs @@ -1,10 +1,5 @@ -using System; using System.Collections.Generic; -using NLog; -using NzbDrone.Common.Extensions; using NzbDrone.Common.Http; -using NzbDrone.Common.Serializer; -using NzbDrone.Core.Indexers.Gazelle; using NzbDrone.Core.IndexerSearch.Definitions; namespace NzbDrone.Core.Indexers.Redacted @@ -12,14 +7,10 @@ namespace NzbDrone.Core.Indexers.Redacted public class RedactedRequestGenerator : IIndexerRequestGenerator { 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; - _httpClient = httpClient; - _logger = logger; } public virtual IndexerPageableRequestChain GetRecentRequests() @@ -54,24 +45,6 @@ namespace NzbDrone.Core.Indexers.Redacted 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 GetRequest(string searchParameters) { var req = RequestBuilder() @@ -81,17 +54,6 @@ namespace NzbDrone.Core.Indexers.Redacted 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(indexResponse.Content); - - return result; - } - private HttpRequestBuilder RequestBuilder() { return new HttpRequestBuilder($"{_settings.BaseUrl.Trim().TrimEnd('/')}") diff --git a/src/NzbDrone.Core/Indexers/Redacted/RedactedSettings.cs b/src/NzbDrone.Core/Indexers/Redacted/RedactedSettings.cs index 622aa33df..7c511cbb3 100644 --- a/src/NzbDrone.Core/Indexers/Redacted/RedactedSettings.cs +++ b/src/NzbDrone.Core/Indexers/Redacted/RedactedSettings.cs @@ -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)] public string ApiKey { get; set; } - [FieldDefinition(1, Hidden = HiddenType.Hidden)] - public string PassKey { get; set; } - - [FieldDefinition(3, Type = FieldType.Textbox, Label = "Minimum Seeders", HelpText = "Minimum number of seeders required.", Advanced = true)] + [FieldDefinition(2, Type = FieldType.Textbox, Label = "Minimum Seeders", HelpText = "Minimum number of seeders required.", Advanced = true)] public int MinimumSeeders { get; set; } - [FieldDefinition(4)] + [FieldDefinition(3)] 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; } - [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 NzbDroneValidationResult Validate()