From c42eaaec53fb76bef57479218c97f76170666c8f Mon Sep 17 00:00:00 2001 From: Harsh Mehta Date: Thu, 2 Jul 2026 18:55:29 +0530 Subject: [PATCH 1/2] Refactor digit validation logic in MavenArchiver Signed-off-by: Harsh Mehta --- .../java/org/apache/maven/shared/archiver/MavenArchiver.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/apache/maven/shared/archiver/MavenArchiver.java b/src/main/java/org/apache/maven/shared/archiver/MavenArchiver.java index 7ab7740..cbab812 100644 --- a/src/main/java/org/apache/maven/shared/archiver/MavenArchiver.java +++ b/src/main/java/org/apache/maven/shared/archiver/MavenArchiver.java @@ -717,7 +717,7 @@ private static boolean isNumeric(String str) { } for (char c : str.toCharArray()) { - if (!Character.isDigit(c)) { + if (c < '0' || c > '9') { return false; } } From ec52bd9235030a9bccc527af5e0e6b4d3fa1abf2 Mon Sep 17 00:00:00 2001 From: Harsh Mehta Date: Thu, 2 Jul 2026 18:59:16 +0530 Subject: [PATCH 2/2] Add test for rejecting non-ASCII unicode digits in timestamp parsing Signed-off-by: Harsh Mehta --- .../shared/archiver/MavenArchiverTest.java | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/src/test/java/org/apache/maven/shared/archiver/MavenArchiverTest.java b/src/test/java/org/apache/maven/shared/archiver/MavenArchiverTest.java index 2419bda..e27b76e 100644 --- a/src/test/java/org/apache/maven/shared/archiver/MavenArchiverTest.java +++ b/src/test/java/org/apache/maven/shared/archiver/MavenArchiverTest.java @@ -1314,6 +1314,26 @@ void thrownParseOutputTimestampInstant(String outputTimestamp) { .withCauseInstanceOf(DateTimeParseException.class); } + @ParameterizedTest + @ValueSource( + strings = { + // Arabic-Indic digits (U+0660–U+0669) + "٠١٢٣٤٥٦٧٨٩", + // Bengali digits (U+09E6–U+09EF) + "০১২৩৪", + // Devanagari digits (U+0966–U+096F) + "०१२३४", + // Extended Arabic-Indic digits (U+06F0–U+06F9) + "۰۱۲۳۴" + }) + void unicodeDigitsAreRejectedAsTimestamp(String unicodeDigits) { + // Character.isDigit() returns true for non-ASCII digits, but Long.parseLong() only accepts ASCII 0-9. + // These must not throw NumberFormatException — they must yield IAE with DateTimeParseException cause. + assertThatExceptionOfType(IllegalArgumentException.class) + .isThrownBy(() -> MavenArchiver.parseBuildOutputTimestamp(unicodeDigits)) + .withCauseInstanceOf(DateTimeParseException.class); + } + @ParameterizedTest @CsvSource({ "2011-12-03T10:15:30+01,1322903730",