diff --git a/src/formats/additionalFormats.ts b/src/formats/additionalFormats.ts index d49c43dc..0e4d0601 100644 --- a/src/formats/additionalFormats.ts +++ b/src/formats/additionalFormats.ts @@ -48,8 +48,8 @@ export const formats: Record Val if (typeof data !== "string" || data === "") { return undefined; } - if (data && data[0] === "0") { - // leading zeroes should be rejected, as they are treated as octals + if (data && data.split(".").some((octet) => octet.length > 1 && octet[0] === "0")) { + // leading zeroes in an octet should be rejected, as they are treated as octals return node.createError("format-ipv4-leading-zero-error", { value: data, pointer, schema }); } if (data.length <= 15 && isValidIPV4.test(data)) { diff --git a/src/tests/issues/issue113.ipv4-leading-zero.test.ts b/src/tests/issues/issue113.ipv4-leading-zero.test.ts new file mode 100644 index 00000000..44dfcd9b --- /dev/null +++ b/src/tests/issues/issue113.ipv4-leading-zero.test.ts @@ -0,0 +1,25 @@ +import { strict as assert } from "assert"; +import { compileSchema } from "../../compileSchema"; + +// issue#113 — ipv4 format validator rejected valid addresses whose first octet +// is "0" (e.g. 0.0.0.0). The guard meant to reject leading-zero *octets* +// (octal-looking, e.g. 01.2.3.4), not any address starting with "0". +describe("issue#113 - ipv4 format rejects valid 0.0.0.0 (over-broad leading-zero guard)", () => { + it("accepts 0.0.0.0 as a valid ipv4 address", () => { + const node = compileSchema({ $schema: "draft-07", format: "ipv4" }); + const { errors } = node.validate("0.0.0.0"); + assert.equal(errors?.length ?? 0, 0, "0.0.0.0 should be valid"); + }); + + it("accepts 127.0.0.1 as a valid ipv4 address", () => { + const node = compileSchema({ $schema: "draft-07", format: "ipv4" }); + const { errors } = node.validate("127.0.0.1"); + assert.equal(errors?.length ?? 0, 0, "127.0.0.1 should be valid"); + }); + + it("rejects 01.2.3.4 (leading zero in an octet, octal-like)", () => { + const node = compileSchema({ $schema: "draft-07", format: "ipv4" }); + const { errors } = node.validate("01.2.3.4"); + assert.notEqual(errors?.length ?? 0, 0, "01.2.3.4 should be rejected"); + }); +});