Skip to content

Commit 777473e

Browse files
authored
Improve validation for AET, IP & hostnames/domain names (#261)
* Improve validation for AET, IP/Host Signed-off-by: Victor Chang <[email protected]>
1 parent ff677ce commit 777473e

File tree

2 files changed

+97
-2
lines changed

2 files changed

+97
-2
lines changed

src/Configuration/Test/ValidationExtensionsTest.cs

+84
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
*/
1616

1717
using System;
18+
using System.Collections.Generic;
1819
using FellowOakDicom;
1920
using Monai.Deploy.InformaticsGateway.Api;
2021
using Xunit;
@@ -202,5 +203,88 @@ public void SourceApplicationEntity_Valid()
202203
}
203204

204205
#endregion SourceApplicationEntity.IsValid
206+
207+
#region IsAeTitleValid
208+
[Theory]
209+
[InlineData("123")]
210+
[InlineData("MYAET")]
211+
[InlineData("EAST-123-123")]
212+
public void GivenAValidAETitle_WhenIIsAeTitleValid_ExpectToReturnTrue(string value)
213+
{
214+
var errors = new List<string>();
215+
Assert.True(ValidationExtensions.IsAeTitleValid("test", value, errors));
216+
Assert.Empty(errors);
217+
}
218+
219+
[Theory]
220+
[InlineData("")]
221+
[InlineData(" ")]
222+
[InlineData("AE\\")]
223+
[InlineData("AE/")]
224+
[InlineData("1$")]
225+
[InlineData("A.E.T.")]
226+
public void GivenAnInvalidAETitle_WhenIsAeTitleValid_ExpectToReturnFalse(string value)
227+
{
228+
var errors = new List<string>();
229+
Assert.False(ValidationExtensions.IsAeTitleValid("test", value, errors));
230+
Assert.NotEmpty(errors);
231+
}
232+
233+
#endregion
234+
235+
#region IsValidHostNameIp
236+
[Theory]
237+
[InlineData("0.0.0.0")]
238+
[InlineData("10.20.30.40")]
239+
[InlineData("255.255.255.0")]
240+
[InlineData("1.2.3.4")]
241+
[InlineData("192.168.0.1")]
242+
public void GivenAValidIpAddress_WhenIsValidHostNameIpIsCalled_ExpectToReturnTrue(string value)
243+
{
244+
var errors = new List<string>();
245+
Assert.True(ValidationExtensions.IsValidHostNameIp("test", value, errors));
246+
Assert.Empty(errors);
247+
}
248+
249+
[Theory]
250+
[InlineData("256.256.256.256")]
251+
[InlineData("1.0")]
252+
[InlineData("1")]
253+
[InlineData("2.3.4")]
254+
public void GivenAnInvalidIpAddress_WhenIsValidHostNameIpIsCalled_ExpectToReturnFalse(string value)
255+
{
256+
var errors = new List<string>();
257+
Assert.False(ValidationExtensions.IsValidHostNameIp("test", value, errors));
258+
Assert.NotEmpty(errors);
259+
}
260+
261+
[Theory]
262+
[InlineData("localhost")]
263+
[InlineData("east-1")]
264+
[InlineData("east-2.k8s.local")]
265+
[InlineData("cloud.com")]
266+
[InlineData("east.cloud.com")]
267+
[InlineData("super.west.cloud.com")]
268+
[InlineData("example-mongodb-0.example-mongodb-svc.monai-deploy.svc.cluster.local")]
269+
public void GivenAValidHostName_WhenIsValidHostNameIpIsCalled_ExpectToReturnTrue(string value)
270+
{
271+
var errors = new List<string>();
272+
Assert.True(ValidationExtensions.IsValidHostNameIp("test", value, errors));
273+
Assert.Empty(errors);
274+
}
275+
276+
[Theory]
277+
[InlineData("localhost!")]
278+
[InlineData("cloud@com")]
279+
[InlineData("[email protected]")]
280+
[InlineData("super/west.cloud.com")]
281+
public void GivenAnInvalidHostName_WhenIsValidHostNameIpIsCalled_ExpectToReturnFalse(string value)
282+
{
283+
var errors = new List<string>();
284+
Assert.False(ValidationExtensions.IsValidHostNameIp("test", value, errors));
285+
Assert.NotEmpty(errors);
286+
}
287+
288+
#endregion
205289
}
206290
}

src/Configuration/ValidationExtensions.cs

+13-2
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717

1818
using System.Collections.Generic;
1919
using System.Linq;
20+
using System.Text.RegularExpressions;
2021
using Ardalis.GuardClauses;
2122
using FellowOakDicom;
2223
using Monai.Deploy.InformaticsGateway.Api;
@@ -94,15 +95,25 @@ public static bool IsAeTitleValid(string source, string aeTitle, IList<string> v
9495
{
9596
Guard.Against.NullOrWhiteSpace(source);
9697

97-
if (!string.IsNullOrWhiteSpace(aeTitle) && aeTitle.Length <= 15) return true;
98+
if (!string.IsNullOrWhiteSpace(aeTitle) &&
99+
aeTitle.Length <= 15 &&
100+
Regex.IsMatch(aeTitle, @"^[a-zA-Z0-9_\-]+$"))
101+
{
102+
return true;
103+
}
98104

99105
validationErrors?.Add($"'{aeTitle}' is not a valid AE Title (source: {source}).");
100106
return false;
101107
}
102108

103109
public static bool IsValidHostNameIp(string source, string hostIp, IList<string> validationErrors = null)
104110
{
105-
if (!string.IsNullOrWhiteSpace(hostIp)) return true;
111+
if (!string.IsNullOrWhiteSpace(hostIp) &&
112+
(Regex.IsMatch(hostIp, @"^((25[0-5]|(2[0-4]|1\d|[1-9]|)\d)\.?\b){4}$") || // IP address
113+
Regex.IsMatch(hostIp, @"^(([a-zA-Z]|[a-zA-Z][a-zA-Z0-9\-]*[a-zA-Z0-9])\.)*([A-Za-z]|[A-Za-z][A-Za-z0-9\-]*[A-Za-z0-9])$"))) // Host/domain name
114+
{
115+
return true;
116+
}
106117

107118
validationErrors?.Add($"Invalid host name/IP address '{hostIp}' specified for {source}.");
108119
return false;

0 commit comments

Comments
 (0)