From e9364ed1bdfc1028b087b4bf3e9b22b0518c4763 Mon Sep 17 00:00:00 2001 From: Indy Prentice Date: Thu, 20 Apr 2023 11:00:00 -0500 Subject: [PATCH] =?UTF-8?q?feat(urn)=20Add=20validator=20to=20reject=20URN?= =?UTF-8?q?s=20which=20contain=20the=20character=20we=20plan=20to=20u?= =?UTF-8?q?=E2=80=A6=20(#7859)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Indy Prentice --- .../com/linkedin/metadata/entity/EntityService.java | 6 ++++++ .../linkedin/metadata/entity/EntityServiceTest.java | 11 +++++++++++ 2 files changed, 17 insertions(+) diff --git a/metadata-io/src/main/java/com/linkedin/metadata/entity/EntityService.java b/metadata-io/src/main/java/com/linkedin/metadata/entity/EntityService.java index a91d54bffdd9c..fe138b9bee6d1 100644 --- a/metadata-io/src/main/java/com/linkedin/metadata/entity/EntityService.java +++ b/metadata-io/src/main/java/com/linkedin/metadata/entity/EntityService.java @@ -171,6 +171,9 @@ public static class IngestProposalResult { private static final int URN_NUM_BYTES_LIMIT = 512; + // TODO(iprentic): Move this to a common utils location once used in other places + private static final String DELIMITER_SEPARATOR = "␟"; + public EntityService( @Nonnull final AspectDao aspectDao, @Nonnull final EventProducer producer, @@ -690,6 +693,9 @@ static void validateUrn(@Nonnull final Urn urn) { if (URLEncoder.encode(urn.toString()).length() > URN_NUM_BYTES_LIMIT) { throw new IllegalArgumentException("Error: cannot provide an URN longer than " + Integer.toString(URN_NUM_BYTES_LIMIT) + " bytes (when URL encoded)"); } + if (urn.toString().contains(DELIMITER_SEPARATOR)) { + throw new IllegalArgumentException("Error: URN cannot contain " + DELIMITER_SEPARATOR + " character"); + } } public void ingestAspects(@Nonnull final Urn urn, @Nonnull List> aspectRecordsToIngest, diff --git a/metadata-io/src/test/java/com/linkedin/metadata/entity/EntityServiceTest.java b/metadata-io/src/test/java/com/linkedin/metadata/entity/EntityServiceTest.java index cb6e24e0faa07..bc5d51714e9ca 100644 --- a/metadata-io/src/test/java/com/linkedin/metadata/entity/EntityServiceTest.java +++ b/metadata-io/src/test/java/com/linkedin/metadata/entity/EntityServiceTest.java @@ -1239,6 +1239,17 @@ public void testValidateUrn() throws Exception { } catch (IllegalArgumentException e) { assertEquals(e.getMessage(), "Error: cannot provide an URN longer than 512 bytes (when URL encoded)"); } + + // Urn containing disallowed character + Urn testUrnSpecialCharValid = new Urn("li", "testType", new TupleKey("entity␇")); + Urn testUrnSpecialCharInvalid = new Urn("li", "testType", new TupleKey("entity␟")); + EntityService.validateUrn(testUrnSpecialCharValid); + try { + EntityService.validateUrn(testUrnSpecialCharInvalid); + Assert.fail("Should have raised IllegalArgumentException for URN containing the illegal char"); + } catch (IllegalArgumentException e) { + assertEquals(e.getMessage(), "Error: URN cannot contain ␟ character"); + } } @Nonnull