(cherry picked from commit 776143cc813ec1b5fa31fbf8667c3ab174b71f5c) New: Treat .scr as dangerous file (cherry picked from commit 103ccd74f30830944e9e9f06d02be096f476ae34) New: .arj and .lzh extensions are potentially dangerous (cherry picked from commit a72288a14e67f62b00f921dbeb1a0f57a61e5ba7) Fixed: Failing dangerous and executable single file downloads (cherry picked from commit e37684e045310ca543aa6a22b38a325cd8a8e84d) Fixed: Rejected Imports with no associated release or indexer (cherry picked from commit 31e02bdeada8c85d67a75b69e57d3e7ea46989c6) Fixed: Don't return warning in title field for rejected downloads (cherry picked from commit 1fa532dd3eaaee01ac6a049e43fcdbd44357d617) Fixed: Improve rejected download handling (cherry picked from commit 4db43882361232eb8fe9ee5331c3d77ea3aa8dfa)pull/10444/merge
parent
91f08a83cd
commit
48075e33ac
@ -0,0 +1,60 @@
|
||||
using System.Linq;
|
||||
using NLog;
|
||||
using NzbDrone.Core.Download.TrackedDownloads;
|
||||
using NzbDrone.Core.Indexers;
|
||||
using NzbDrone.Core.MediaFiles.MovieImport;
|
||||
|
||||
namespace NzbDrone.Core.Download;
|
||||
|
||||
public interface IRejectedImportService
|
||||
{
|
||||
bool Process(TrackedDownload trackedDownload, ImportResult importResult);
|
||||
}
|
||||
|
||||
public class RejectedImportService : IRejectedImportService
|
||||
{
|
||||
private readonly ICachedIndexerSettingsProvider _cachedIndexerSettingsProvider;
|
||||
private readonly Logger _logger;
|
||||
|
||||
public RejectedImportService(ICachedIndexerSettingsProvider cachedIndexerSettingsProvider, Logger logger)
|
||||
{
|
||||
_cachedIndexerSettingsProvider = cachedIndexerSettingsProvider;
|
||||
_logger = logger;
|
||||
}
|
||||
|
||||
public bool Process(TrackedDownload trackedDownload, ImportResult importResult)
|
||||
{
|
||||
if (importResult.Result != ImportResultType.Rejected || trackedDownload.RemoteMovie?.Release == null)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
var indexerSettings = _cachedIndexerSettingsProvider.GetSettings(trackedDownload.RemoteMovie.Release.IndexerId);
|
||||
var rejectionReason = importResult.ImportDecision.Rejections.FirstOrDefault()?.Reason;
|
||||
|
||||
if (indexerSettings == null)
|
||||
{
|
||||
trackedDownload.Warn(new TrackedDownloadStatusMessage(trackedDownload.DownloadItem.Title, importResult.Errors));
|
||||
return true;
|
||||
}
|
||||
|
||||
if (rejectionReason == ImportRejectionReason.DangerousFile &&
|
||||
indexerSettings.FailDownloads.Contains(FailDownloads.PotentiallyDangerous))
|
||||
{
|
||||
_logger.Trace("Download '{0}' contains potentially dangerous file, marking as failed", trackedDownload.DownloadItem.Title);
|
||||
trackedDownload.Fail();
|
||||
}
|
||||
else if (rejectionReason == ImportRejectionReason.ExecutableFile &&
|
||||
indexerSettings.FailDownloads.Contains(FailDownloads.Executables))
|
||||
{
|
||||
_logger.Trace("Download '{0}' contains executable file, marking as failed", trackedDownload.DownloadItem.Title);
|
||||
trackedDownload.Fail();
|
||||
}
|
||||
else
|
||||
{
|
||||
trackedDownload.Warn(new TrackedDownloadStatusMessage(trackedDownload.DownloadItem.Title, importResult.Errors));
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
@ -0,0 +1,69 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using NzbDrone.Common.Cache;
|
||||
using NzbDrone.Core.Messaging.Events;
|
||||
using NzbDrone.Core.ThingiProvider.Events;
|
||||
|
||||
namespace NzbDrone.Core.Indexers;
|
||||
|
||||
public interface ICachedIndexerSettingsProvider
|
||||
{
|
||||
CachedIndexerSettings GetSettings(int indexerId);
|
||||
}
|
||||
|
||||
public class CachedIndexerSettingsProvider : ICachedIndexerSettingsProvider, IHandle<ProviderUpdatedEvent<IIndexer>>
|
||||
{
|
||||
private readonly IIndexerFactory _indexerFactory;
|
||||
private readonly ICached<CachedIndexerSettings> _cache;
|
||||
|
||||
public CachedIndexerSettingsProvider(IIndexerFactory indexerFactory, ICacheManager cacheManager)
|
||||
{
|
||||
_indexerFactory = indexerFactory;
|
||||
_cache = cacheManager.GetRollingCache<CachedIndexerSettings>(GetType(), "settingsByIndexer", TimeSpan.FromHours(1));
|
||||
}
|
||||
|
||||
public CachedIndexerSettings GetSettings(int indexerId)
|
||||
{
|
||||
if (indexerId == 0)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
return _cache.Get(indexerId.ToString(), () => FetchIndexerSettings(indexerId));
|
||||
}
|
||||
|
||||
private CachedIndexerSettings FetchIndexerSettings(int indexerId)
|
||||
{
|
||||
var indexer = _indexerFactory.Get(indexerId);
|
||||
var indexerSettings = indexer.Settings as IIndexerSettings;
|
||||
|
||||
if (indexerSettings == null)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
var settings = new CachedIndexerSettings
|
||||
{
|
||||
FailDownloads = indexerSettings.FailDownloads.Select(f => (FailDownloads)f).ToHashSet()
|
||||
};
|
||||
|
||||
if (indexer.Settings is ITorrentIndexerSettings torrentIndexerSettings)
|
||||
{
|
||||
settings.SeedCriteriaSettings = torrentIndexerSettings.SeedCriteria;
|
||||
}
|
||||
|
||||
return settings;
|
||||
}
|
||||
|
||||
public void Handle(ProviderUpdatedEvent<IIndexer> message)
|
||||
{
|
||||
_cache.Clear();
|
||||
}
|
||||
}
|
||||
|
||||
public class CachedIndexerSettings
|
||||
{
|
||||
public HashSet<FailDownloads> FailDownloads { get; set; }
|
||||
public SeedCriteriaSettings SeedCriteriaSettings { get; set; }
|
||||
}
|
@ -0,0 +1,12 @@
|
||||
using NzbDrone.Core.Annotations;
|
||||
|
||||
namespace NzbDrone.Core.Indexers;
|
||||
|
||||
public enum FailDownloads
|
||||
{
|
||||
[FieldOption(Label = "Executables")]
|
||||
Executables = 0,
|
||||
|
||||
[FieldOption(Label = "Potentially Dangerous")]
|
||||
PotentiallyDangerous = 1
|
||||
}
|
Loading…
Reference in new issue