From 07f1637c54501be27bac158416a24bed109b8d38 Mon Sep 17 00:00:00 2001 From: Steve Ayers Date: Tue, 4 Feb 2025 16:49:43 -0500 Subject: [PATCH] Add URN validation to URI rule (#236) This adds additional validation for URNs to the `isUri` rule. --- .../buf/protovalidate/CustomOverload.java | 37 +++++++++++-------- 1 file changed, 22 insertions(+), 15 deletions(-) diff --git a/src/main/java/build/buf/protovalidate/CustomOverload.java b/src/main/java/build/buf/protovalidate/CustomOverload.java index f69d59ee..cd60e93f 100644 --- a/src/main/java/build/buf/protovalidate/CustomOverload.java +++ b/src/main/java/build/buf/protovalidate/CustomOverload.java @@ -25,9 +25,8 @@ import java.net.Inet4Address; import java.net.Inet6Address; import java.net.InetAddress; -import java.net.MalformedURLException; +import java.net.URI; import java.net.URISyntaxException; -import java.net.URL; import java.util.HashSet; import java.util.Set; import org.projectnessie.cel.common.types.BoolT; @@ -357,11 +356,7 @@ private static Overload isUri() { if (addr.isEmpty()) { return BoolT.False; } - try { - return Types.boolOf(new URL(addr).toURI().isAbsolute()); - } catch (MalformedURLException | URISyntaxException e) { - return BoolT.False; - } + return Types.boolOf(validateURI(addr, true)); }); } @@ -381,14 +376,7 @@ private static Overload isUriRef() { if (addr.isEmpty()) { return BoolT.False; } - try { - // TODO: The URL api requires a host or it always fails. - String host = "http://protovalidate.buf.build"; - URL url = new URL(host + addr); - return Types.boolOf(url.getPath() != null && !url.getPath().isEmpty()); - } catch (MalformedURLException e) { - return BoolT.False; - } + return Types.boolOf(validateURI(addr, false)); }); } @@ -609,6 +597,25 @@ private static boolean validateIP(String addr, long ver) { return false; } + /** + * Validates if the input string is a valid URI, which can be a URL or a URN. + * + * @param val The input string to validate as a URI. + * @param checkAbsolute Whether to check if this URI is absolute (i.e. has a scheme component) + * @return {@code true} if the input string is a valid URI, {@code false} otherwise. + */ + private static boolean validateURI(String val, boolean checkAbsolute) { + try { + URI uri = new URI(val); + if (checkAbsolute) { + return uri.isAbsolute(); + } + return true; + } catch (URISyntaxException e) { + return false; + } + } + /** * Validates if the input string is a valid IP prefix. *