Skip to content

Commit c9b10c6

Browse files
authored
Merge pull request #86 from vaslabs/fix/hostnameValidation
Make hostname validation compatible with kubernetes ingresses
2 parents a8aaf98 + 18a2258 commit c9b10c6

File tree

2 files changed

+14
-5
lines changed

2 files changed

+14
-5
lines changed

src/main/scala/kubeyml/ingress/Protocol.scala

+9-1
Original file line numberDiff line numberDiff line change
@@ -59,8 +59,16 @@ case class Spec(rules: List[Rule])
5959
sealed trait Rule
6060

6161
case class Host(value: String) {
62+
private val validationRegex = "[a-z0-9]([-a-z0-9]*[a-z0-9])?(\\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*"
63+
private def errorMessage = s""""
64+
Invalid value: ${value}:
65+
a DNS-1123 subdomain must consist of lower case alphanumeric characters, '-' or '.',
66+
and must start and end with an alphanumeric character
67+
(e.g. 'example.com', regex used for validation is
68+
'${validationRegex}')
69+
"""
6270
require(value.nonEmpty, "Hostname cannot be empty")
63-
require(value.matches("([a-zA-Z0-9\\-_]+\\.?)*"), s"Hostname has a wrong format ${value}")
71+
require(value.matches(s"${validationRegex}"), errorMessage)
6472
}
6573

6674
case class HttpRule(host: Host, paths: List[Path]) extends Rule

src/test/scala/kubeyml/ingress/KubernetesComponents.scala

+5-4
Original file line numberDiff line numberDiff line change
@@ -48,17 +48,18 @@ trait KubernetesComponents {
4848
private val arbitraryNonEmptyString: Gen[NonEmptyString] =
4949
Gen.nonEmptyListOf(Gen.alphaChar).map(_.mkString).map(NonEmptyString)
5050

51+
private val arbitraryNonEmptyLowercaseString: Gen[NonEmptyString] =
52+
Gen.nonEmptyListOf(Gen.alphaLowerChar).map(_.mkString).map(NonEmptyString)
53+
5154
private val pathVariableGen: Gen[PathVariable] = for {
5255
serviceName <- arbitraryNonEmptyString.map(_.value)
5356
servicePort <- Gen.chooseNum(0, 65535)
5457
path <- Gen.oneOf(arbitraryNonEmptyString.map(s => s"/$s"), Gen.const("/"))
5558
} yield PathVariable(serviceName, servicePort, path)
5659

5760
private val hostnameWordGen: Gen[String] =
58-
Gen.oneOf(
59-
Gen.nonEmptyListOf(arbitraryNonEmptyString.map(_.value)).map(_.mkString("-")),
60-
Gen.nonEmptyListOf(arbitraryNonEmptyString.map(_.value)).map(_.mkString("_")),
61-
)
61+
Gen.nonEmptyListOf(arbitraryNonEmptyLowercaseString.map(_.value)).map(_.mkString("-"))
62+
6263

6364
private val ruleVariableGen: Gen[RuleVariable] = for {
6465
host <- Gen.oneOf(

0 commit comments

Comments
 (0)