diff --git a/NzbDrone.Core.Test/ProviderTests/NewznabProviderTest.cs b/NzbDrone.Core.Test/ProviderTests/NewznabProviderTest.cs index 3d94e97b4..ea296922d 100644 --- a/NzbDrone.Core.Test/ProviderTests/NewznabProviderTest.cs +++ b/NzbDrone.Core.Test/ProviderTests/NewznabProviderTest.cs @@ -9,6 +9,7 @@ using NzbDrone.Core.Providers; using NzbDrone.Core.Repository; using NzbDrone.Core.Repository.Quality; using NzbDrone.Core.Test.Framework; +using NzbDrone.Test.Common; using NzbDrone.Test.Common.AutoMoq; namespace NzbDrone.Core.Test.ProviderTests @@ -295,5 +296,19 @@ namespace NzbDrone.Core.Test.ProviderTests var result = db.Fetch(); result.Should().HaveCount(2); } + + [Test] + public void CheckHostname_should_do_nothing_if_hostname_is_valid() + { + Mocker.Resolve().CheckHostname("http://www.google.com"); + } + + [Test] + [ExpectedException("System.Net.Sockets.SocketException")] + public void CheckHostname_should_log_error_and_throw_exception_if_dnsHostname_is_invalid() + { + Mocker.Resolve().CheckHostname("http://BadName"); + ExceptionVerification.ExpectedErrors(1); + } } } \ No newline at end of file diff --git a/NzbDrone.Core/Providers/NewznabProvider.cs b/NzbDrone.Core/Providers/NewznabProvider.cs index efb1e89f5..541bd8c61 100644 --- a/NzbDrone.Core/Providers/NewznabProvider.cs +++ b/NzbDrone.Core/Providers/NewznabProvider.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Net; using Ninject; using NLog; using NzbDrone.Core.Providers.Indexer; @@ -56,7 +57,11 @@ namespace NzbDrone.Core.Providers var definitionsList = definitions.ToList(); //Cleanup the URL for each definition - definitionsList.ForEach(p => p.Url = (new Uri(p.Url).ParentUriString())); + foreach(var newznabDefinition in definitionsList) + { + CheckHostname(newznabDefinition.Url); + newznabDefinition.Url = new Uri(newznabDefinition.Url).ParentUriString(); + } _database.UpdateMany(definitionsList); } @@ -99,5 +104,22 @@ namespace NzbDrone.Core.Providers { _database.Delete(id); } + + public virtual void CheckHostname(string url) + { + try + { + var uri = new Uri(url); + var hostname = uri.DnsSafeHost; + + Dns.GetHostEntry(hostname); + } + catch (Exception ex) + { + Logger.Error("Invalid address {0}, please correct the site URL.", url); + throw; + } + + } } } \ No newline at end of file diff --git a/NzbDrone.Web/Controllers/SettingsController.cs b/NzbDrone.Web/Controllers/SettingsController.cs index f2e08fb67..14e6bb721 100644 --- a/NzbDrone.Web/Controllers/SettingsController.cs +++ b/NzbDrone.Web/Controllers/SettingsController.cs @@ -391,8 +391,15 @@ namespace NzbDrone.Web.Controllers _configProvider.FileSharingTalkUid = data.FileSharingTalkUid; _configProvider.FileSharingTalkSecret = data.FileSharingTalkSecret; - if (data.NewznabDefinitions != null) - _newznabProvider.SaveAll(data.NewznabDefinitions); + try + { + if (data.NewznabDefinitions != null) + _newznabProvider.SaveAll(data.NewznabDefinitions); + } + catch(Exception) + { + return JsonNotificationResult.Oops("Invalid Nzbnab Indexer found, please check your settings"); + } return GetSuccessResult(); }