parent
9e6b32ca3e
commit
6bdeafcf8c
|
@ -39,7 +39,7 @@ function HostSettings(props) {
|
||||||
<FormInputGroup
|
<FormInputGroup
|
||||||
type={inputTypes.TEXT}
|
type={inputTypes.TEXT}
|
||||||
name="bindAddress"
|
name="bindAddress"
|
||||||
helpText="Valid IPv4 address or '*' for all interfaces"
|
helpText="Valid IP address, localhost or '*' for all interfaces"
|
||||||
helpTextWarning="Requires restart to take effect"
|
helpTextWarning="Requires restart to take effect"
|
||||||
onChange={onInputChange}
|
onChange={onInputChange}
|
||||||
{...bindAddress}
|
{...bindAddress}
|
||||||
|
|
|
@ -0,0 +1,25 @@
|
||||||
|
using System.Globalization;
|
||||||
|
using FluentAssertions;
|
||||||
|
using NUnit.Framework;
|
||||||
|
using NzbDrone.Common.Extensions;
|
||||||
|
|
||||||
|
namespace NzbDrone.Common.Test.ExtensionTests.StringExtensionTests
|
||||||
|
{
|
||||||
|
[TestFixture]
|
||||||
|
public class IsValidIPAddressFixture
|
||||||
|
{
|
||||||
|
[TestCase("192.168.0.1")]
|
||||||
|
[TestCase("::1")]
|
||||||
|
[TestCase("2001:db8:4006:812::200e")]
|
||||||
|
public void should_validate_ip_address(string input)
|
||||||
|
{
|
||||||
|
input.IsValidIpAddress().Should().BeTrue();
|
||||||
|
}
|
||||||
|
|
||||||
|
[TestCase("sonarr.tv")]
|
||||||
|
public void should_not_parse_non_ip_address(string input)
|
||||||
|
{
|
||||||
|
input.IsValidIpAddress().Should().BeFalse();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -2,6 +2,8 @@ using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Globalization;
|
using System.Globalization;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
|
using System.Net;
|
||||||
|
using System.Net.Sockets;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Text.RegularExpressions;
|
using System.Text.RegularExpressions;
|
||||||
|
|
||||||
|
@ -215,5 +217,25 @@ namespace NzbDrone.Common.Extensions
|
||||||
.Replace("'", "%27")
|
.Replace("'", "%27")
|
||||||
.Replace("%7E", "~");
|
.Replace("%7E", "~");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static bool IsValidIpAddress(this string value)
|
||||||
|
{
|
||||||
|
if (!IPAddress.TryParse(value, out var parsedAddress))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (parsedAddress.Equals(IPAddress.Parse("255.255.255.255")))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (parsedAddress.IsIPv6Multicast)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return parsedAddress.AddressFamily == AddressFamily.InterNetwork || parsedAddress.AddressFamily == AddressFamily.InterNetworkV6;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,30 +1,14 @@
|
||||||
using System.Net;
|
|
||||||
using System.Net.Sockets;
|
|
||||||
using FluentValidation;
|
using FluentValidation;
|
||||||
using FluentValidation.Validators;
|
using FluentValidation.Validators;
|
||||||
|
using NzbDrone.Common.Extensions;
|
||||||
|
|
||||||
namespace NzbDrone.Core.Validation
|
namespace NzbDrone.Core.Validation
|
||||||
{
|
{
|
||||||
public static class IpValidation
|
public static class IpValidation
|
||||||
{
|
{
|
||||||
public static IRuleBuilderOptions<T, string> ValidIp4Address<T>(this IRuleBuilder<T, string> ruleBuilder)
|
public static IRuleBuilderOptions<T, string> ValidIpAddress<T>(this IRuleBuilder<T, string> ruleBuilder)
|
||||||
{
|
{
|
||||||
return ruleBuilder.Must(x =>
|
return ruleBuilder.Must(x => x.IsValidIpAddress()).WithMessage("Must contain wildcard (*) or a valid IP Address");
|
||||||
{
|
|
||||||
IPAddress parsedAddress;
|
|
||||||
|
|
||||||
if (!IPAddress.TryParse(x, out parsedAddress))
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (parsedAddress.Equals(IPAddress.Parse("255.255.255.255")))
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return parsedAddress.AddressFamily == AddressFamily.InterNetwork;
|
|
||||||
}).WithMessage("Must contain wildcard (*) or a valid IPv4 Address");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static IRuleBuilderOptions<T, string> NotListenAllIp4Address<T>(this IRuleBuilder<T, string> ruleBuilder)
|
public static IRuleBuilderOptions<T, string> NotListenAllIp4Address<T>(this IRuleBuilder<T, string> ruleBuilder)
|
||||||
|
|
|
@ -33,9 +33,9 @@ namespace Sonarr.Api.V3.Config
|
||||||
_userService = userService;
|
_userService = userService;
|
||||||
|
|
||||||
SharedValidator.RuleFor(c => c.BindAddress)
|
SharedValidator.RuleFor(c => c.BindAddress)
|
||||||
.ValidIp4Address()
|
.ValidIpAddress()
|
||||||
.NotListenAllIp4Address()
|
.NotListenAllIp4Address()
|
||||||
.When(c => c.BindAddress != "*");
|
.When(c => c.BindAddress != "*" && c.BindAddress != "localhost");
|
||||||
|
|
||||||
SharedValidator.RuleFor(c => c.Port).ValidPort();
|
SharedValidator.RuleFor(c => c.Port).ValidPort();
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue