From 858ab88940f3b208835c3ad70b7010ab700e38ee Mon Sep 17 00:00:00 2001 From: Sebastian Malton Date: Fri, 7 Aug 2020 16:24:47 -0400 Subject: [PATCH] use the Kubernetes regex for matching system names (#659) * use the Kubernetes regex for matching system names Signed-off-by: Sebastian Malton Co-authored-by: Sebastian Malton --- locales/en/messages.po | 4 +- locales/fi/messages.po | 2 +- locales/ru/messages.po | 2 +- src/renderer/api/kube-api-parse.ts | 2 +- .../components/input/input.validators.ts | 5 +- .../components/input/input.validators_test.ts | 48 +++++++++++++++++++ 6 files changed, 56 insertions(+), 7 deletions(-) create mode 100644 src/renderer/components/input/input.validators_test.ts diff --git a/locales/en/messages.po b/locales/en/messages.po index f2ca7973e8..6f2abc511f 100644 --- a/locales/en/messages.po +++ b/locales/en/messages.po @@ -2178,8 +2178,8 @@ msgid "This field is required" msgstr "This field is required" #: src/renderer/components/input/input.validators.ts:39 -msgid "This field must contain only lowercase latin characters, numbers and dash." -msgstr "This field must contain only lowercase latin characters, numbers and dash." +msgid "A System Name must be lowercase DNS labels separated by dots. DNS labels are alphanumerics and dashes enclosed by alphanumerics." +msgstr "A System Name must be lowercase DNS labels separated by dots. DNS labels are alphanumerics and dashes enclosed by alphanumerics." #: src/renderer/components/+network-policies/network-policy-details.tsx:59 msgid "To" diff --git a/locales/fi/messages.po b/locales/fi/messages.po index 4d81ae2a65..5cfa28d784 100644 --- a/locales/fi/messages.po +++ b/locales/fi/messages.po @@ -2161,7 +2161,7 @@ msgid "This field is required" msgstr "" #: src/renderer/components/input/input.validators.ts:39 -msgid "This field must contain only lowercase latin characters, numbers and dash." +msgid "A System Name must be lowercase DNS labels separated by dots. DNS labels are alphanumerics and dashes enclosed by alphanumerics." msgstr "" #: src/renderer/components/+network-policies/network-policy-details.tsx:59 diff --git a/locales/ru/messages.po b/locales/ru/messages.po index 6e55ab9f73..d67fcd9ab1 100644 --- a/locales/ru/messages.po +++ b/locales/ru/messages.po @@ -2179,7 +2179,7 @@ msgid "This field is required" msgstr "Это обязательное поле" #: src/renderer/components/input/input.validators.ts:39 -msgid "This field must contain only lowercase latin characters, numbers and dash." +msgid "A System Name must be lowercase DNS labels separated by dots. DNS labels are alphanumerics and dashes enclosed by alphanumerics." msgstr "Это поле может содержать только латинские буквы в нижнем регистре, номера и дефис." #: src/renderer/components/+network-policies/network-policy-details.tsx:59 diff --git a/src/renderer/api/kube-api-parse.ts b/src/renderer/api/kube-api-parse.ts index 97a7875322..1354f86b60 100644 --- a/src/renderer/api/kube-api-parse.ts +++ b/src/renderer/api/kube-api-parse.ts @@ -59,7 +59,7 @@ export function parseApi(path: string): IKubeApiLinkBase { * - `GROUP` is /^D(\.D)*$/ where D is `DNS_LABEL` and length <= 253 * * There is no well defined selection from an array of items that were - * seperated by '/' + * separated by '/' * * Solution is to create a huristic. Namely: * 1. if '.' in left[0] then apiGroup <- left[0] diff --git a/src/renderer/components/input/input.validators.ts b/src/renderer/components/input/input.validators.ts index b0b415ef9f..7db0934d4f 100644 --- a/src/renderer/components/input/input.validators.ts +++ b/src/renderer/components/input/input.validators.ts @@ -53,9 +53,10 @@ export const maxLength: Validator = { validate: (value, { maxLength }) => value.length <= maxLength, }; +const systemNameMatcher = /^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$/; export const systemName: Validator = { - message: () => _i18n._(t`This field must contain only lowercase latin characters, numbers and dash.`), - validate: value => !!value.match(/^[a-z0-9-]+$/), + message: () => _i18n._(t`A System Name must be lowercase DNS labels separated by dots. DNS labels are alphanumerics and dashes enclosed by alphanumerics.`), + validate: value => !!value.match(systemNameMatcher), }; export const accountId: Validator = { diff --git a/src/renderer/components/input/input.validators_test.ts b/src/renderer/components/input/input.validators_test.ts new file mode 100644 index 0000000000..4477d63e93 --- /dev/null +++ b/src/renderer/components/input/input.validators_test.ts @@ -0,0 +1,48 @@ +import { isEmail, systemName } from "./input.validators"; + +describe("input validation tests", () => { + describe("isEmail tests", () => { + it("should be valid", () => { + expect(isEmail.validate("abc@news.com")).toBe(true); + expect(isEmail.validate("abc@news.co.uk")).toBe(true); + expect(isEmail.validate("abc1.3@news.co.uk")).toBe(true); + expect(isEmail.validate("abc1.3@news.name")).toBe(true); + }); + + it("should be invalid", () => { + expect(isEmail.validate("@news.com")).toBe(false); + expect(isEmail.validate("abcnews.co.uk")).toBe(false); + expect(isEmail.validate("abc1.3@news")).toBe(false); + expect(isEmail.validate("abc1.3@news.name.a.b.c.d.d")).toBe(false); + }); + }); + + describe("systemName tests", () => { + it("should be valid", () => { + expect(systemName.validate("a")).toBe(true); + expect(systemName.validate("ab")).toBe(true); + expect(systemName.validate("abc")).toBe(true); + expect(systemName.validate("1")).toBe(true); + expect(systemName.validate("12")).toBe(true); + expect(systemName.validate("123")).toBe(true); + expect(systemName.validate("1a2")).toBe(true); + expect(systemName.validate("1-2")).toBe(true); + expect(systemName.validate("1---------------2")).toBe(true); + expect(systemName.validate("1---------------2.a")).toBe(true); + expect(systemName.validate("1---------------2.a.1")).toBe(true); + expect(systemName.validate("1---------------2.9-a.1")).toBe(true); + }); + + it("should be invalid", () => { + expect(systemName.validate("")).toBe(false); + expect(systemName.validate("-")).toBe(false); + expect(systemName.validate(".")).toBe(false); + expect(systemName.validate("as.")).toBe(false); + expect(systemName.validate(".asd")).toBe(false); + expect(systemName.validate("a.-")).toBe(false); + expect(systemName.validate("a.1-")).toBe(false); + expect(systemName.validate("o.2-2.")).toBe(false); + expect(systemName.validate("o.2-2....")).toBe(false); + }); + }); +}); \ No newline at end of file