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; } } 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",