From e27757cff67662f4aef90ec8b2fbd07f8fee2e5c Mon Sep 17 00:00:00 2001 From: 4naesthetic <37602498+4naesthetic@users.noreply.github.com> Date: Thu, 6 Jun 2024 16:30:13 +0100 Subject: [PATCH] Fix for incorrect validation failure for %-encoded '[' and ']' characters. --- .../com/networknt/schema/format/IriFormat.java | 2 +- .../schema/format/IriReferenceFormat.java | 2 +- .../com/networknt/schema/format/IriFormatTest.java | 14 ++++++++++++++ .../schema/format/IriReferenceFormatTest.java | 14 ++++++++++++++ 4 files changed, 30 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/networknt/schema/format/IriFormat.java b/src/main/java/com/networknt/schema/format/IriFormat.java index 150741ddf..7d74429fe 100644 --- a/src/main/java/com/networknt/schema/format/IriFormat.java +++ b/src/main/java/com/networknt/schema/format/IriFormat.java @@ -17,7 +17,7 @@ protected boolean validate(URI uri) { } } - String query = uri.getQuery(); + String query = uri.getRawQuery(); if (query != null) { // [ and ] must be percent encoded if (query.indexOf('[') != -1 || query.indexOf(']') != -1) { diff --git a/src/main/java/com/networknt/schema/format/IriReferenceFormat.java b/src/main/java/com/networknt/schema/format/IriReferenceFormat.java index 45f8bd93b..aa0a0d0c9 100644 --- a/src/main/java/com/networknt/schema/format/IriReferenceFormat.java +++ b/src/main/java/com/networknt/schema/format/IriReferenceFormat.java @@ -14,7 +14,7 @@ protected boolean validate(URI uri) { return false; } } - String query = uri.getQuery(); + String query = uri.getRawQuery(); if (query != null) { // [ and ] must be percent encoded if (query.indexOf('[') != -1 || query.indexOf(']') != -1) { diff --git a/src/test/java/com/networknt/schema/format/IriFormatTest.java b/src/test/java/com/networknt/schema/format/IriFormatTest.java index d8655bfc1..112f726f3 100644 --- a/src/test/java/com/networknt/schema/format/IriFormatTest.java +++ b/src/test/java/com/networknt/schema/format/IriFormatTest.java @@ -56,6 +56,20 @@ void queryWithBracketsShouldFail() { InputFormat.JSON); assertFalse(messages.isEmpty()); } + + @Test + void queryWithEncodedBracketsShouldPass() { + String schemaData = "{\r\n" + + " \"format\": \"iri\"\r\n" + + "}"; + + SchemaValidatorsConfig config = new SchemaValidatorsConfig(); + config.setFormatAssertionsEnabled(true); + JsonSchema schema = JsonSchemaFactory.getInstance(VersionFlag.V202012).getSchema(schemaData, config); + Set messages = schema.validate("\"https://test.com/assets/product.pdf?filter%5Btest%5D=1\"", + InputFormat.JSON); + assertTrue(messages.isEmpty()); + } @Test void iriShouldPass() { diff --git a/src/test/java/com/networknt/schema/format/IriReferenceFormatTest.java b/src/test/java/com/networknt/schema/format/IriReferenceFormatTest.java index 4bbaedaa9..eba077115 100644 --- a/src/test/java/com/networknt/schema/format/IriReferenceFormatTest.java +++ b/src/test/java/com/networknt/schema/format/IriReferenceFormatTest.java @@ -57,6 +57,20 @@ void queryWithBracketsShouldFail() { assertFalse(messages.isEmpty()); } + @Test + void queryWithEncodedBracketsShouldPass() { + String schemaData = "{\r\n" + + " \"format\": \"iri-reference\"\r\n" + + "}"; + + SchemaValidatorsConfig config = new SchemaValidatorsConfig(); + config.setFormatAssertionsEnabled(true); + JsonSchema schema = JsonSchemaFactory.getInstance(VersionFlag.V202012).getSchema(schemaData, config); + Set messages = schema.validate("\"https://test.com/assets/product.pdf?filter%5Btest%5D=1\"", + InputFormat.JSON); + assertTrue(messages.isEmpty()); + } + @Test void iriShouldPass() { String schemaData = "{\r\n"