using System ;
using System.Linq ;
using System.Text.RegularExpressions ;
using FluentValidation ;
using NzbDrone.Common.Extensions ;
using NzbDrone.Core.Annotations ;
using NzbDrone.Core.Indexers.Newznab ;
using NzbDrone.Core.Validation ;
namespace NzbDrone.Core.Indexers.Torznab
{
public class TorznabSettingsValidator : AbstractValidator < TorznabSettings >
{
private static readonly string [ ] ApiKeyWhiteList = Array . Empty < string > ( ) ;
private static bool ShouldHaveApiKey ( TorznabSettings settings )
{
return settings . BaseUrl ! = null & & ApiKeyWhiteList . Any ( c = > settings . BaseUrl . ToLowerInvariant ( ) . Contains ( c ) ) ;
}
private static readonly Regex AdditionalParametersRegex = new Regex ( @"(&.+?\=.+?)+" , RegexOptions . Compiled ) ;
public TorznabSettingsValidator ( )
{
RuleFor ( c = > c ) . Custom ( ( c , context ) = >
{
if ( c . Categories . Empty ( ) )
{
context . AddFailure ( "'Categories' must be provided" ) ;
}
} ) ;
RuleFor ( c = > c . BaseUrl ) . ValidRootUrl ( ) ;
RuleFor ( c = > c . ApiPath ) . ValidUrlBase ( "/api" ) ;
RuleFor ( c = > c . ApiKey ) . NotEmpty ( ) . When ( ShouldHaveApiKey ) ;
RuleFor ( c = > c . AdditionalParameters ) . Matches ( AdditionalParametersRegex )
. When ( c = > ! c . AdditionalParameters . IsNullOrWhiteSpace ( ) ) ;
RuleFor ( c = > c . SeedCriteria ) . SetValidator ( _ = > new SeedCriteriaSettingsValidator ( ) ) ;
}
}
public class TorznabSettings : NewznabSettings , ITorrentIndexerSettings
{
private static readonly TorznabSettingsValidator Validator = new TorznabSettingsValidator ( ) ;
public TorznabSettings ( )
{
MinimumSeeders = IndexerDefaults . MINIMUM_SEEDERS ;
}
[FieldDefinition(7, Type = FieldType.Textbox, Label = "Minimum Seeders", HelpText = "Minimum number of seeders required.", Advanced = true)]
public int MinimumSeeders { get ; set ; }
[FieldDefinition(8)]
public SeedCriteriaSettings SeedCriteria { get ; set ; } = new SeedCriteriaSettings ( ) ;
[FieldDefinition(9, Type = FieldType.Checkbox, Label = "Reject Blocklisted Torrent Hashes While Grabbing", HelpText = "If a torrent is blocked by hash it may not properly be rejected during RSS/Search for some indexers, enabling this will allow it to be rejected after the torrent is grabbed, but before it is sent to the client.", Advanced = true)]
public bool RejectBlocklistedTorrentHashesWhileGrabbing { get ; set ; }
public override NzbDroneValidationResult Validate ( )
{
return new NzbDroneValidationResult ( Validator . Validate ( this ) ) ;
}
}
}