diff options
author | Jon Marius Venstad <venstad@gmail.com> | 2022-03-30 15:52:09 +0200 |
---|---|---|
committer | Jon Marius Venstad <venstad@gmail.com> | 2022-03-30 15:52:09 +0200 |
commit | 51368648e157524420ece2e1754acbe93e0c1eaf (patch) | |
tree | 99d61228b06ff81c2f9bc9260eb8c178e5116c82 /vespajlib | |
parent | 43567e1f53e756772316ea7f0850fdc1602f2f73 (diff) |
Split in DomainName and Hostname
Diffstat (limited to 'vespajlib')
5 files changed, 135 insertions, 14 deletions
diff --git a/vespajlib/src/main/java/ai/vespa/validation/DomainName.java b/vespajlib/src/main/java/ai/vespa/validation/DomainName.java new file mode 100644 index 00000000000..52d9acc822c --- /dev/null +++ b/vespajlib/src/main/java/ai/vespa/validation/DomainName.java @@ -0,0 +1,34 @@ +// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +package ai.vespa.validation; + +import java.util.regex.Pattern; + +import static ai.vespa.validation.Validation.requireInRange; +import static ai.vespa.validation.Validation.requireMatch; + +/** + * A valid domain name, which can be used in a {@link java.net.URI}. + * + * @author jonmv + */ +public class DomainName extends StringWrapper<DomainName> { + + public static final Pattern labelPattern = Pattern.compile("([A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9-]{0,61}[A-Za-z0-9])"); + public static final Pattern domainNamePattern = Pattern.compile("(" + labelPattern + "\\.)*" + labelPattern); + + public static final DomainName localhost = DomainName.of("localhost"); + + private DomainName(String value) { + super(value); + } + + public static DomainName of(String value) { + requireInRange(value.length(), "domain name", 1, 255); + return new DomainName(requireMatch(value, "domain name", domainNamePattern)); + } + + public static String requireLabel(String label) { + return requireMatch(label, "domain name label", labelPattern); + } + +} diff --git a/vespajlib/src/main/java/ai/vespa/validation/Hostname.java b/vespajlib/src/main/java/ai/vespa/validation/Hostname.java index 1af1d5e9a19..e53dd501c45 100644 --- a/vespajlib/src/main/java/ai/vespa/validation/Hostname.java +++ b/vespajlib/src/main/java/ai/vespa/validation/Hostname.java @@ -1,32 +1,23 @@ // Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package ai.vespa.validation; -import java.util.regex.Pattern; - +import static ai.vespa.validation.Validation.requireInRange; import static ai.vespa.validation.Validation.requireMatch; /** - * A valid hostname. + * A valid hostname, matching {@link DomainName#domainNamePattern}, and no more than 64 characters in length. * * @author jonmv */ public class Hostname extends StringWrapper<Hostname> { - public static final Pattern hostnameLabel = Pattern.compile("([A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9-]{0,61}[A-Za-z0-9])"); - public static final Pattern hostnamePattern = Pattern.compile("(?=.{1,255})(" + hostnameLabel + "\\.)*" + hostnameLabel); - - public static final Hostname localhost = Hostname.of("localhost"); - private Hostname(String value) { super(value); } - public static Hostname of(String hostname) { - return new Hostname(requireMatch(hostname, "hostname", hostnamePattern)); - } - - public static String requireLabel(String label) { - return requireMatch(label, "hostname label", hostnameLabel); + public static Hostname of(String value) { + requireInRange(value.length(), "hostname length", 1, 64); + return new Hostname(requireMatch(value, "hostname", DomainName.domainNamePattern)); } } diff --git a/vespajlib/src/test/java/ai/vespa/validation/DomainNameTest.java b/vespajlib/src/test/java/ai/vespa/validation/DomainNameTest.java new file mode 100644 index 00000000000..dad2086d6ea --- /dev/null +++ b/vespajlib/src/test/java/ai/vespa/validation/DomainNameTest.java @@ -0,0 +1,34 @@ +// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +package ai.vespa.validation; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertThrows; + +/** + * @author jonmv + */ +class DomainNameTest { + + @Test + void testNames() { + DomainName.of("name-123.0.321-eman"); + DomainName.of(("." + "a".repeat(63)).repeat(4).substring(1)); + DomainName.of("123"); + + assertThrows(IllegalArgumentException.class, () -> DomainName.of("_")); + assertThrows(IllegalArgumentException.class, () -> DomainName.of("-")); + assertThrows(IllegalArgumentException.class, () -> DomainName.of(".")); + assertThrows(IllegalArgumentException.class, () -> DomainName.of("-foo")); + assertThrows(IllegalArgumentException.class, () -> DomainName.of("foo-")); + assertThrows(IllegalArgumentException.class, () -> DomainName.of(".foo")); + assertThrows(IllegalArgumentException.class, () -> DomainName.of("foo.")); + assertThrows(IllegalArgumentException.class, () -> DomainName.of("foo..bar")); + assertThrows(IllegalArgumentException.class, () -> DomainName.of("foo.-.bar")); + assertThrows(IllegalArgumentException.class, () -> DomainName.of("foo/")); + assertThrows(IllegalArgumentException.class, () -> DomainName.of("foo%")); + assertThrows(IllegalArgumentException.class, () -> DomainName.of(("." + "a".repeat(32)).repeat(8).substring(1, 257))); + assertThrows(IllegalArgumentException.class, () -> DomainName.of("a".repeat(64))); + } + +} diff --git a/vespajlib/src/test/java/ai/vespa/validation/HostnameTest.java b/vespajlib/src/test/java/ai/vespa/validation/HostnameTest.java new file mode 100644 index 00000000000..7969c2a5f78 --- /dev/null +++ b/vespajlib/src/test/java/ai/vespa/validation/HostnameTest.java @@ -0,0 +1,34 @@ +// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +package ai.vespa.validation; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertThrows; + +/** + * @author jonmv + */ +public class HostnameTest { + + @Test + void testNames() { + Hostname.of("name-123.0.321-eman"); + Hostname.of(("." + "a".repeat(32)).repeat(2).substring(1, 65)); + Hostname.of("123"); + + assertThrows(IllegalArgumentException.class, () -> Hostname.of("_")); + assertThrows(IllegalArgumentException.class, () -> Hostname.of("-")); + assertThrows(IllegalArgumentException.class, () -> Hostname.of(".")); + assertThrows(IllegalArgumentException.class, () -> Hostname.of("-foo")); + assertThrows(IllegalArgumentException.class, () -> Hostname.of("foo-")); + assertThrows(IllegalArgumentException.class, () -> Hostname.of(".foo")); + assertThrows(IllegalArgumentException.class, () -> Hostname.of("foo.")); + assertThrows(IllegalArgumentException.class, () -> Hostname.of("foo..bar")); + assertThrows(IllegalArgumentException.class, () -> Hostname.of("foo.-.bar")); + assertThrows(IllegalArgumentException.class, () -> Hostname.of("foo/")); + assertThrows(IllegalArgumentException.class, () -> Hostname.of("foo%")); + assertThrows(IllegalArgumentException.class, () -> Hostname.of(("." + "a".repeat(32)).repeat(2).substring(1, 66))); + assertThrows(IllegalArgumentException.class, () -> Hostname.of("a".repeat(64))); + } + +} diff --git a/vespajlib/src/test/java/ai/vespa/validation/NameTest.java b/vespajlib/src/test/java/ai/vespa/validation/NameTest.java new file mode 100644 index 00000000000..a578bb718a7 --- /dev/null +++ b/vespajlib/src/test/java/ai/vespa/validation/NameTest.java @@ -0,0 +1,28 @@ +// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +package ai.vespa.validation; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertThrows; + +/** + * @author jonmv + */ +class NameTest { + + @Test + void testNames() { + Name.of("name123-_-"); + Name.of("O".repeat(255)); + + assertThrows(IllegalArgumentException.class, () -> Name.of("0")); + assertThrows(IllegalArgumentException.class, () -> Name.of("_")); + assertThrows(IllegalArgumentException.class, () -> Name.of("-")); + assertThrows(IllegalArgumentException.class, () -> Name.of("foo.")); + assertThrows(IllegalArgumentException.class, () -> Name.of("foo/")); + assertThrows(IllegalArgumentException.class, () -> Name.of("foo%")); + assertThrows(IllegalArgumentException.class, () -> Name.of("w".repeat(256))); + } + +} |