Skip to content

Commit 6376ecd

Browse files
authored
Prefix file magic detection (#1550)
Resolver now with enabled prefix file discovery discovers even wrong files, most specifically in Maven ITs where Jetty handler is not mounted to URL and receives all sort of garbage, that is assumed to be prefix file. From now on, prefix file must start with following line (be the very first line in prefixes.txt): ``` ## repository-prefixes/2.0 ``` Fixes #1549
1 parent 31cecc9 commit 6376ecd

File tree

3 files changed

+30
-4
lines changed

3 files changed

+30
-4
lines changed

maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/filter/PrefixesRemoteRepositoryFilterSource.java

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import javax.inject.Named;
2323
import javax.inject.Singleton;
2424

25+
import java.io.BufferedReader;
2526
import java.io.FileNotFoundException;
2627
import java.io.IOException;
2728
import java.io.UncheckedIOException;
@@ -85,6 +86,11 @@ public final class PrefixesRemoteRepositoryFilterSource extends RemoteRepository
8586

8687
private static final String PREFIX_FILE_PATH = ".meta/prefixes.txt";
8788

89+
/**
90+
* Visible for UT.
91+
*/
92+
static final String PREFIX_FIRST_LINE = "## repository-prefixes/2.0";
93+
8894
/**
8995
* Is filter enabled?
9096
*
@@ -183,7 +189,7 @@ private PrefixTree loadPrefixTree(
183189
if (filePath == null) {
184190
filePath = resolvePrefixesFromRemoteRepository(session, remoteRepository);
185191
}
186-
if (filePath != null) {
192+
if (isPrefixFile(filePath)) {
187193
logger.debug(
188194
"Loading prefixes for remote repository {} from file '{}'", remoteRepository.getId(), filePath);
189195
try (Stream<String> lines = Files.lines(filePath, StandardCharsets.UTF_8)) {
@@ -204,6 +210,19 @@ private PrefixTree loadPrefixTree(
204210
return PrefixTree.SENTINEL;
205211
}
206212

213+
private boolean isPrefixFile(Path path) {
214+
if (path == null || !Files.isRegularFile(path)) {
215+
return false;
216+
}
217+
try (BufferedReader reader = Files.newBufferedReader(path, StandardCharsets.UTF_8)) {
218+
return PREFIX_FIRST_LINE.equals(reader.readLine());
219+
} catch (FileNotFoundException e) {
220+
return false;
221+
} catch (IOException e) {
222+
throw new UncheckedIOException(e);
223+
}
224+
}
225+
207226
private Path resolvePrefixesFromLocalConfiguration(
208227
RepositorySystemSession session, Path baseDir, RemoteRepository remoteRepository) {
209228
Path filePath = baseDir.resolve(PREFIXES_FILE_PREFIX + remoteRepository.getId() + PREFIXES_FILE_SUFFIX);

maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/filter/PrefixesRemoteRepositoryFilterSourceTest.java

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -76,11 +76,15 @@ protected void allowArtifact(
7676
Path baseDir = session.getLocalRepository()
7777
.getBasePath()
7878
.resolve(PrefixesRemoteRepositoryFilterSource.LOCAL_REPO_PREFIX_DIR);
79-
Path groupId = baseDir.resolve(PrefixesRemoteRepositoryFilterSource.PREFIXES_FILE_PREFIX
79+
Path prefixes = baseDir.resolve(PrefixesRemoteRepositoryFilterSource.PREFIXES_FILE_PREFIX
8080
+ remoteRepository.getId()
8181
+ PrefixesRemoteRepositoryFilterSource.PREFIXES_FILE_SUFFIX);
82-
Files.createDirectories(groupId.getParent());
83-
Files.write(groupId, artifact.getGroupId().replaceAll("\\.", "/").getBytes(StandardCharsets.UTF_8));
82+
Files.createDirectories(prefixes.getParent());
83+
Files.write(
84+
prefixes,
85+
(PrefixesRemoteRepositoryFilterSource.PREFIX_FIRST_LINE + "\n"
86+
+ artifact.getGroupId().replaceAll("\\.", "/"))
87+
.getBytes(StandardCharsets.UTF_8));
8488
} catch (IOException e) {
8589
throw new UncheckedIOException(e);
8690
}

src/site/markdown/remote-repository-filtering.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,9 @@ Many MRMs and Maven Central itself publish these files. Some prefixes file examp
126126
The user provided prefixes files are expected in the following location by default:
127127
`${filterBasedir}/prefixes-${remoteRepository.id}.txt`.
128128

129+
**Important**: Valid prefix files start with following "magic" on their very first line: `## repository-prefixes/2.0`.
130+
If the first line in file is not this string, the prefix file is discarded.
131+
129132
To disable prefixes filter, use the following setting: `-Daether.remoteRepositoryFilter.prefixes=false`.
130133
To disable for single repository filtering, append to key `.repoId`.
131134

0 commit comments

Comments
 (0)