Skip to content

Commit f6c7832

Browse files
committed
Improve validation for AET, IP/Host
Signed-off-by: Victor Chang <[email protected]>
1 parent 9a0a705 commit f6c7832

File tree

2 files changed

+102
-8
lines changed

2 files changed

+102
-8
lines changed

src/Configuration/Test/ValidationExtensionsTest.cs

Lines changed: 83 additions & 0 deletions
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,87 @@ 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+
public void GivenAValidHostName_WhenIsValidHostNameIpIsCalled_ExpectToReturnTrue(string value)
269+
{
270+
var errors = new List<string>();
271+
Assert.True(ValidationExtensions.IsValidHostNameIp("test", value, errors));
272+
Assert.Empty(errors);
273+
}
274+
275+
[Theory]
276+
[InlineData("localhost!")]
277+
[InlineData("cloud@com")]
278+
[InlineData("[email protected]")]
279+
[InlineData("super/west.cloud.com")]
280+
public void GivenAnInvalidHostName_WhenIsValidHostNameIpIsCalled_ExpectToReturnFalse(string value)
281+
{
282+
var errors = new List<string>();
283+
Assert.False(ValidationExtensions.IsValidHostNameIp("test", value, errors));
284+
Assert.NotEmpty(errors);
285+
}
286+
287+
#endregion
205288
}
206289
}

src/Configuration/ValidationExtensions.cs

Lines changed: 19 additions & 8 deletions
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;
@@ -29,7 +30,7 @@ public static class ValidationExtensions
2930

3031
public static bool IsValid(this MonaiApplicationEntity monaiApplicationEntity, out IList<string> validationErrors)
3132
{
32-
Guard.Against.Null(monaiApplicationEntity, nameof(monaiApplicationEntity));
33+
Guard.Against.Null(monaiApplicationEntity);
3334

3435
validationErrors = new List<string>();
3536

@@ -42,7 +43,7 @@ public static bool IsValid(this MonaiApplicationEntity monaiApplicationEntity, o
4243

4344
public static bool IsValid(this DestinationApplicationEntity destinationApplicationEntity, out IList<string> validationErrors)
4445
{
45-
Guard.Against.Null(destinationApplicationEntity, nameof(destinationApplicationEntity));
46+
Guard.Against.Null(destinationApplicationEntity);
4647

4748
validationErrors = new List<string>();
4849

@@ -57,7 +58,7 @@ public static bool IsValid(this DestinationApplicationEntity destinationApplicat
5758

5859
public static bool IsValid(this SourceApplicationEntity sourceApplicationEntity, out IList<string> validationErrors)
5960
{
60-
Guard.Against.Null(sourceApplicationEntity, nameof(sourceApplicationEntity));
61+
Guard.Against.Null(sourceApplicationEntity);
6162

6263
validationErrors = new List<string>();
6364

@@ -70,7 +71,7 @@ public static bool IsValid(this SourceApplicationEntity sourceApplicationEntity,
7071

7172
public static bool IsValidDicomTag(string source, string grouping, IList<string> validationErrors = null)
7273
{
73-
Guard.Against.NullOrWhiteSpace(source, nameof(source));
74+
Guard.Against.NullOrWhiteSpace(source);
7475

7576
try
7677
{
@@ -92,25 +93,35 @@ public static bool IsValidDicomTag(string source, string grouping, IList<string>
9293

9394
public static bool IsAeTitleValid(string source, string aeTitle, IList<string> validationErrors = null)
9495
{
95-
Guard.Against.NullOrWhiteSpace(source, nameof(source));
96+
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;
109120
}
110121

111122
public static bool IsPortValid(string source, int port, IList<string> validationErrors = null)
112123
{
113-
Guard.Against.NullOrWhiteSpace(source, nameof(source));
124+
Guard.Against.NullOrWhiteSpace(source);
114125

115126
if (port > 0 && port <= 65535) return true;
116127

0 commit comments

Comments
 (0)