From 1a63c9ac5b3cf737c2140e2d35605dddd2bc0d44 Mon Sep 17 00:00:00 2001 From: Mcat12 Date: Sun, 16 Jun 2019 19:46:14 -0700 Subject: [PATCH 01/14] Update conditional forwarding settings to new API This updates the web interface with the changes made in pi-hole/api#176 and pi-hole/api#178. These changes enable IPv6 conditional forwarding support. Signed-off-by: Mcat12 --- .../ConditionalForwardingSettings.tsx | 7 +++-- src/components/settings/DNSInfo.tsx | 20 +++++------- src/types/api.d.ts | 3 +- src/util/__tests__/validate.test.tsx | 31 +++++++++++++++++++ src/util/validate.tsx | 10 ++++++ 5 files changed, 55 insertions(+), 16 deletions(-) diff --git a/src/components/settings/ConditionalForwardingSettings.tsx b/src/components/settings/ConditionalForwardingSettings.tsx index df00d47..de3c2c5 100644 --- a/src/components/settings/ConditionalForwardingSettings.tsx +++ b/src/components/settings/ConditionalForwardingSettings.tsx @@ -14,8 +14,9 @@ import i18next from "i18next"; export interface ConditionalForwardingObject { enabled: boolean; - routerIp: string; + ip: string; domain: string; + cidr: number; } export interface ConditionalForwardingSettingsProps { @@ -52,8 +53,8 @@ const ConditionalForwardingSettings = ({ onUpdate({ ...settings, routerIp: e.target.value })} + value={settings.ip} + onChange={e => onUpdate({ ...settings, ip: e.target.value })} invalid={!isRouterIpValid} /> diff --git a/src/components/settings/DNSInfo.tsx b/src/components/settings/DNSInfo.tsx index d6886e6..6b87b79 100644 --- a/src/components/settings/DNSInfo.tsx +++ b/src/components/settings/DNSInfo.tsx @@ -23,7 +23,7 @@ import ConditionalForwardingSettings, { } from "./ConditionalForwardingSettings"; import DnsOptionSettings, { DnsOptionsObject } from "./DnsOptionSettings"; import Alert, { AlertType } from "../common/Alert"; -import { isValidHostname, isValidIpv4 } from "../../util/validate"; +import { isValidHostname, isValidIpv4, isValidIpv6 } from "../../util/validate"; export interface DNSInfoState { alertMessage: string; @@ -44,8 +44,9 @@ class DNSInfo extends Component { upstreamDns: [], conditionalForwarding: { enabled: false, - routerIp: "", - domain: "" + ip: "", + domain: "", + cidr: 24 }, options: { fqdnRequired: false, @@ -69,8 +70,7 @@ class DNSInfo extends Component { this.setState({ upstreamDns: res.upstream_dns, conditionalForwarding: { - enabled: res.conditional_forwarding.enabled, - routerIp: res.conditional_forwarding.router_ip, + ...res.conditional_forwarding, domain }, options: { @@ -136,11 +136,7 @@ class DNSInfo extends Component { this.updateHandler = makeCancelable( api.updateDNSInfo({ upstream_dns: this.state.upstreamDns, - conditional_forwarding: { - enabled: this.state.conditionalForwarding.enabled, - router_ip: this.state.conditionalForwarding.routerIp, - domain: this.state.conditionalForwarding.domain - }, + conditional_forwarding: this.state.conditionalForwarding, options: { fqdn_required: this.state.options.fqdnRequired, bogus_priv: this.state.options.bogusPriv, @@ -195,8 +191,8 @@ class DNSInfo extends Component { const { t } = this.props; const isRouterIpValid = this.isCFSettingValid( - this.state.conditionalForwarding.routerIp, - isValidIpv4 + this.state.conditionalForwarding.ip, + address => isValidIpv4(address) || isValidIpv6(address) ); const isDomainValid = this.isCFSettingValid( diff --git a/src/types/api.d.ts b/src/types/api.d.ts index bd1f2cb..c9b88e8 100644 --- a/src/types/api.d.ts +++ b/src/types/api.d.ts @@ -54,8 +54,9 @@ interface ApiDnsSettings { }; conditional_forwarding: { enabled: boolean; - router_ip: string; + ip: string; domain: string; + cidr: number; }; } diff --git a/src/util/__tests__/validate.test.tsx b/src/util/__tests__/validate.test.tsx index 58f5bf0..2b91f08 100644 --- a/src/util/__tests__/validate.test.tsx +++ b/src/util/__tests__/validate.test.tsx @@ -13,6 +13,7 @@ import { isValidDomain, isValidIpv4, isValidIpv4OptionalPort, + isValidIpv6, isValidIpv6OptionalPort, isValidRegex } from "../validate"; @@ -229,6 +230,36 @@ describe("Testing the validation functions", () => { }); }); + describe("isValidIpv6", () => { + it("passes 1fff:0:a88:85a3::ac1f", () => { + expect(isValidIpv6("1fff:0:a88:85a3::ac1f")).toBe(true); + }); + + it("passes ::1", () => { + expect(isValidIpv6("::1")).toBe(true); + }); + + it("fails [::1]:5353", () => { + expect(isValidIpv6("[::1]:5353")).toBe(false); + }); + + it("fails [1fff:0:a88:85a3::ac1f]:8001", () => { + expect(isValidIpv6("[1fff:0:a88:85a3::ac1f]:8001")).toBe(false); + }); + + it("fails 192.168.1.1", () => { + expect(isValidIpv6("192.168.1.1")).toBe(false); + }); + + it("fails 192.168.1.1:53", () => { + expect(isValidIpv6("192.168.1.1:53")).toBe(false); + }); + + it("fails [::1]", () => { + expect(isValidIpv6("[::1]")).toBe(false); + }); + }); + describe("isValidIpv6OptionalPort", () => { it("passes 1fff:0:a88:85a3::ac1f", () => { expect(isValidIpv6OptionalPort("1fff:0:a88:85a3::ac1f")).toBe(true); diff --git a/src/util/validate.tsx b/src/util/validate.tsx index b428ece..1efa46b 100644 --- a/src/util/validate.tsx +++ b/src/util/validate.tsx @@ -95,6 +95,16 @@ export function isValidIpv4OptionalPort(address: string): boolean { ); } +/** + * Check if the string is a valid IPv6 address. This function does not do a + * thorough check of the IPv6 address; the backend will check it in detail. + * + * @param address + */ +export function isValidIpv6(address: string): boolean { + return /^[a-fA-F0-9:]+$/.test(address); +} + /** * 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 From e513f94610438c2c0c5a7020732f3ae6740d8c58 Mon Sep 17 00:00:00 2001 From: Mcat12 Date: Mon, 17 Jun 2019 17:41:40 -0700 Subject: [PATCH 02/14] Update fake data with new conditional forwarding API Signed-off-by: Mcat12 --- scripts/make-fake-data.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/scripts/make-fake-data.js b/scripts/make-fake-data.js index c18a0a5..d4af560 100644 --- a/scripts/make-fake-data.js +++ b/scripts/make-fake-data.js @@ -377,11 +377,12 @@ function getDNSInfo() { }, conditional_forwarding: { enabled: faker.random.boolean(), - router_ip: faker.internet.ip(), + ip: faker.internet.ip(), domain: faker.random .word() .toLowerCase() - .split(" ", 2)[0] + .split(" ", 2)[0], + cidr: faker.random.number({ min: 1, max: 32 }) } }; } From ca7ef484d59b72722e59a1888435ecec8f9378a2 Mon Sep 17 00:00:00 2001 From: Mcat12 Date: Mon, 17 Jun 2019 19:38:32 -0700 Subject: [PATCH 03/14] Add CIDR prefix length to the settings page Signed-off-by: Mcat12 --- public/i18n/en/settings.json | 3 ++- .../ConditionalForwardingSettings.tsx | 22 +++++++++++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/public/i18n/en/settings.json b/public/i18n/en/settings.json index 59bafce..aef67ae 100644 --- a/public/i18n/en/settings.json +++ b/public/i18n/en/settings.json @@ -27,5 +27,6 @@ "Successfully saved settings": "Successfully saved settings", "Detected custom upstream server": "Detected custom upstream server", "DNS Options": "DNS Options", - "Rapid Commit": "Rapid Commit" + "Rapid Commit": "Rapid Commit", + "Prefix length (CIDR)": "Prefix length (CIDR)" } \ No newline at end of file diff --git a/src/components/settings/ConditionalForwardingSettings.tsx b/src/components/settings/ConditionalForwardingSettings.tsx index de3c2c5..bf58d49 100644 --- a/src/components/settings/ConditionalForwardingSettings.tsx +++ b/src/components/settings/ConditionalForwardingSettings.tsx @@ -59,6 +59,28 @@ const ConditionalForwardingSettings = ({ /> + + + + { + const cidr = parseInt(e.target.value); + + // Only allow numbers + if (isNaN(cidr)) { + return; + } + + onUpdate({ ...settings, cidr }); + }} + /> + +