From 6bb15d607dafb3ab0b07520abbbfccab6079b165 Mon Sep 17 00:00:00 2001 From: Mcat12 Date: Mon, 27 May 2019 17:40:48 -0700 Subject: [PATCH] Add isValidIpv6OptionalPort Signed-off-by: Mcat12 --- src/util/__tests__/validate.test.tsx | 33 ++++++++++++++++++++++++++++ src/util/validate.tsx | 14 ++++++++++++ 2 files changed, 47 insertions(+) diff --git a/src/util/__tests__/validate.test.tsx b/src/util/__tests__/validate.test.tsx index 3e9eb34..58f5bf0 100644 --- a/src/util/__tests__/validate.test.tsx +++ b/src/util/__tests__/validate.test.tsx @@ -13,6 +13,7 @@ import { isValidDomain, isValidIpv4, isValidIpv4OptionalPort, + isValidIpv6OptionalPort, isValidRegex } from "../validate"; @@ -227,4 +228,36 @@ describe("Testing the validation functions", () => { expect(isValidIpv4OptionalPort("127.0.0.1#53")).toBe(false); }); }); + + describe("isValidIpv6OptionalPort", () => { + it("passes 1fff:0:a88:85a3::ac1f", () => { + expect(isValidIpv6OptionalPort("1fff:0:a88:85a3::ac1f")).toBe(true); + }); + + it("passes ::1", () => { + expect(isValidIpv6OptionalPort("::1")).toBe(true); + }); + + it("passes [::1]:5353", () => { + expect(isValidIpv6OptionalPort("[::1]:5353")).toBe(true); + }); + + it("passes [1fff:0:a88:85a3::ac1f]:8001", () => { + expect(isValidIpv6OptionalPort("[1fff:0:a88:85a3::ac1f]:8001")).toBe( + true + ); + }); + + it("fails 192.168.1.1", () => { + expect(isValidIpv6OptionalPort("192.168.1.1")).toBe(false); + }); + + it("fails 192.168.1.1:53", () => { + expect(isValidIpv6OptionalPort("192.168.1.1:53")).toBe(false); + }); + + it("fails [::1]", () => { + expect(isValidIpv6OptionalPort("[::1]")).toBe(false); + }); + }); }); diff --git a/src/util/validate.tsx b/src/util/validate.tsx index f6ea274..b428ece 100644 --- a/src/util/validate.tsx +++ b/src/util/validate.tsx @@ -94,3 +94,17 @@ export function isValidIpv4OptionalPort(address: string): boolean { split.length === 1 || (split.length === 2 && isPositiveNumber(split[1])) ); } + +/** + * Check if the string is a valid IPv6 address, and it can contain an optional + * port. This function does not do a thorough check of the IPv6 address; the + * backend will check it in detail. + * Examples: + * 1fff:0:a88:85a3::ac1f + * [1fff:0:a88:85a3::ac1f]:8001 + * + * @param address The IPv6 address + */ +export function isValidIpv6OptionalPort(address: string): boolean { + return /^(\[[a-fA-F0-9:]+]:\d+|[a-fA-F0-9:]+)$/.test(address); +}