From dcb19a66b078a0d6e3a68d25b9063316b8a0d7d6 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Fri, 19 May 2023 00:30:09 +0300 Subject: [PATCH] New: Add minimum version checks for applications --- .../Applications/Lidarr/Lidarr.cs | 7 ++--- .../Applications/Lidarr/LidarrV1Proxy.cs | 15 +++++++++- .../Applications/Radarr/Radarr.cs | 7 ++--- .../Applications/Radarr/RadarrV3Proxy.cs | 28 ++++++++++++++++++- .../Applications/Sonarr/Sonarr.cs | 7 ++--- .../Applications/Sonarr/SonarrV3Proxy.cs | 15 +++++++++- 6 files changed, 64 insertions(+), 15 deletions(-) diff --git a/src/NzbDrone.Core/Applications/Lidarr/Lidarr.cs b/src/NzbDrone.Core/Applications/Lidarr/Lidarr.cs index 30965e6ca..323a978fb 100644 --- a/src/NzbDrone.Core/Applications/Lidarr/Lidarr.cs +++ b/src/NzbDrone.Core/Applications/Lidarr/Lidarr.cs @@ -1,7 +1,6 @@ using System; using System.Collections.Generic; using System.Linq; -using System.Net; using FluentValidation.Results; using Newtonsoft.Json.Linq; using NLog; @@ -49,10 +48,10 @@ namespace NzbDrone.Core.Applications.Lidarr { failures.AddIfNotNull(_lidarrV1Proxy.TestConnection(BuildLidarrIndexer(testIndexer, DownloadProtocol.Usenet), Settings)); } - catch (WebException ex) + catch (Exception ex) { _logger.Error(ex, "Unable to send test message"); - failures.AddIfNotNull(new ValidationFailure("BaseUrl", "Unable to complete application test, cannot connect to Lidarr")); + failures.AddIfNotNull(new ValidationFailure("BaseUrl", $"Unable to complete application test, cannot connect to Lidarr. {ex.Message}")); } return new ValidationResult(failures); @@ -61,7 +60,7 @@ namespace NzbDrone.Core.Applications.Lidarr public override List GetIndexerMappings() { var indexers = _lidarrV1Proxy.GetIndexers(Settings) - .Where(i => i.Implementation == "Newznab" || i.Implementation == "Torznab"); + .Where(i => i.Implementation is "Newznab" or "Torznab"); var mappings = new List(); diff --git a/src/NzbDrone.Core/Applications/Lidarr/LidarrV1Proxy.cs b/src/NzbDrone.Core/Applications/Lidarr/LidarrV1Proxy.cs index 0ddb25e55..228fc1384 100644 --- a/src/NzbDrone.Core/Applications/Lidarr/LidarrV1Proxy.cs +++ b/src/NzbDrone.Core/Applications/Lidarr/LidarrV1Proxy.cs @@ -23,8 +23,11 @@ namespace NzbDrone.Core.Applications.Lidarr public class LidarrV1Proxy : ILidarrV1Proxy { + private static Version MinimumApplicationVersion => new (1, 0, 2, 0); + private const string AppApiRoute = "/api/v1"; private const string AppIndexerApiRoute = $"{AppApiRoute}/indexer"; + private readonly IHttpClient _httpClient; private readonly Logger _logger; @@ -102,7 +105,17 @@ namespace NzbDrone.Core.Applications.Lidarr try { - Execute(request); + var applicationVersion = _httpClient.Post(request).Headers.GetSingleValue("X-Application-Version"); + + if (applicationVersion == null) + { + return new ValidationFailure(string.Empty, "Failed to fetch Lidarr version"); + } + + if (new Version(applicationVersion) < MinimumApplicationVersion) + { + return new ValidationFailure(string.Empty, $"Lidarr version should be at least {MinimumApplicationVersion.ToString(3)}. Version reported is {applicationVersion}", applicationVersion); + } } catch (HttpException ex) { diff --git a/src/NzbDrone.Core/Applications/Radarr/Radarr.cs b/src/NzbDrone.Core/Applications/Radarr/Radarr.cs index 41e0799ee..69b1ae061 100644 --- a/src/NzbDrone.Core/Applications/Radarr/Radarr.cs +++ b/src/NzbDrone.Core/Applications/Radarr/Radarr.cs @@ -1,7 +1,6 @@ using System; using System.Collections.Generic; using System.Linq; -using System.Net; using FluentValidation.Results; using Newtonsoft.Json.Linq; using NLog; @@ -49,10 +48,10 @@ namespace NzbDrone.Core.Applications.Radarr { failures.AddIfNotNull(_radarrV3Proxy.TestConnection(BuildRadarrIndexer(testIndexer, DownloadProtocol.Usenet), Settings)); } - catch (WebException ex) + catch (Exception ex) { _logger.Error(ex, "Unable to send test message"); - failures.AddIfNotNull(new ValidationFailure("BaseUrl", "Unable to complete application test, cannot connect to Radarr")); + failures.AddIfNotNull(new ValidationFailure("BaseUrl", $"Unable to complete application test, cannot connect to Radarr. {ex.Message}")); } return new ValidationResult(failures); @@ -61,7 +60,7 @@ namespace NzbDrone.Core.Applications.Radarr public override List GetIndexerMappings() { var indexers = _radarrV3Proxy.GetIndexers(Settings) - .Where(i => i.Implementation == "Newznab" || i.Implementation == "Torznab"); + .Where(i => i.Implementation is "Newznab" or "Torznab"); var mappings = new List(); diff --git a/src/NzbDrone.Core/Applications/Radarr/RadarrV3Proxy.cs b/src/NzbDrone.Core/Applications/Radarr/RadarrV3Proxy.cs index 6e4efa1a1..19613ca81 100644 --- a/src/NzbDrone.Core/Applications/Radarr/RadarrV3Proxy.cs +++ b/src/NzbDrone.Core/Applications/Radarr/RadarrV3Proxy.cs @@ -23,8 +23,12 @@ namespace NzbDrone.Core.Applications.Radarr public class RadarrV3Proxy : IRadarrV3Proxy { + private static Version MinimumApplicationV4Version => new (4, 0, 4, 0); + private static Version MinimumApplicationV3Version => new (3, 1, 1, 0); + private const string AppApiRoute = "/api/v3"; private const string AppIndexerApiRoute = $"{AppApiRoute}/indexer"; + private readonly IHttpClient _httpClient; private readonly Logger _logger; @@ -102,7 +106,29 @@ namespace NzbDrone.Core.Applications.Radarr try { - Execute(request); + var applicationVersion = _httpClient.Post(request).Headers.GetSingleValue("X-Application-Version"); + + if (applicationVersion == null) + { + return new ValidationFailure(string.Empty, "Failed to fetch Radarr version"); + } + + var version = new Version(applicationVersion); + + if (version.Major == 3) + { + if (version < MinimumApplicationV3Version) + { + return new ValidationFailure(string.Empty, $"Radarr version should be at least {MinimumApplicationV3Version.ToString(3)}. Version reported is {applicationVersion}", applicationVersion); + } + } + else + { + if (version < MinimumApplicationV4Version) + { + return new ValidationFailure(string.Empty, $"Radarr version should be at least {MinimumApplicationV4Version.ToString(3)}. Version reported is {applicationVersion}", applicationVersion); + } + } } catch (HttpException ex) { diff --git a/src/NzbDrone.Core/Applications/Sonarr/Sonarr.cs b/src/NzbDrone.Core/Applications/Sonarr/Sonarr.cs index d079bf0c5..2f476e82c 100644 --- a/src/NzbDrone.Core/Applications/Sonarr/Sonarr.cs +++ b/src/NzbDrone.Core/Applications/Sonarr/Sonarr.cs @@ -1,7 +1,6 @@ using System; using System.Collections.Generic; using System.Linq; -using System.Net; using FluentValidation.Results; using Newtonsoft.Json.Linq; using NLog; @@ -49,10 +48,10 @@ namespace NzbDrone.Core.Applications.Sonarr { failures.AddIfNotNull(_sonarrV3Proxy.TestConnection(BuildSonarrIndexer(testIndexer, DownloadProtocol.Usenet), Settings)); } - catch (WebException ex) + catch (Exception ex) { _logger.Error(ex, "Unable to send test message"); - failures.AddIfNotNull(new ValidationFailure("BaseUrl", "Unable to complete application test, cannot connect to Sonarr")); + failures.AddIfNotNull(new ValidationFailure("BaseUrl", $"Unable to complete application test, cannot connect to Sonarr. {ex.Message}")); } return new ValidationResult(failures); @@ -61,7 +60,7 @@ namespace NzbDrone.Core.Applications.Sonarr public override List GetIndexerMappings() { var indexers = _sonarrV3Proxy.GetIndexers(Settings) - .Where(i => i.Implementation == "Newznab" || i.Implementation == "Torznab"); + .Where(i => i.Implementation is "Newznab" or "Torznab"); var mappings = new List(); diff --git a/src/NzbDrone.Core/Applications/Sonarr/SonarrV3Proxy.cs b/src/NzbDrone.Core/Applications/Sonarr/SonarrV3Proxy.cs index 018338386..4b17352ad 100644 --- a/src/NzbDrone.Core/Applications/Sonarr/SonarrV3Proxy.cs +++ b/src/NzbDrone.Core/Applications/Sonarr/SonarrV3Proxy.cs @@ -23,8 +23,11 @@ namespace NzbDrone.Core.Applications.Sonarr public class SonarrV3Proxy : ISonarrV3Proxy { + private static Version MinimumApplicationVersion => new (3, 0, 5, 0); + private const string AppApiRoute = "/api/v3"; private const string AppIndexerApiRoute = $"{AppApiRoute}/indexer"; + private readonly IHttpClient _httpClient; private readonly Logger _logger; @@ -102,7 +105,17 @@ namespace NzbDrone.Core.Applications.Sonarr try { - Execute(request); + var applicationVersion = _httpClient.Post(request).Headers.GetSingleValue("X-Application-Version"); + + if (applicationVersion == null) + { + return new ValidationFailure(string.Empty, "Failed to fetch Sonarr version"); + } + + if (new Version(applicationVersion) < MinimumApplicationVersion) + { + return new ValidationFailure(string.Empty, $"Sonarr version should be at least {MinimumApplicationVersion.ToString(3)}. Version reported is {applicationVersion}", applicationVersion); + } } catch (HttpException ex) {