diff --git a/addons/koji/common/src/test/java/org/commonjava/indy/koji/util/PathMaskCheckerTest.java b/addons/koji/common/src/test/java/org/commonjava/indy/koji/util/PathMaskCheckerTest.java new file mode 100644 index 0000000000..2af101e291 --- /dev/null +++ b/addons/koji/common/src/test/java/org/commonjava/indy/koji/util/PathMaskCheckerTest.java @@ -0,0 +1,88 @@ +package org.commonjava.indy.koji.util; + +import org.commonjava.indy.core.content.PathMaskChecker; +import org.commonjava.indy.model.core.HostedRepository; +import org.commonjava.indy.model.core.RemoteRepository; +import org.junit.Test; + +import java.util.List; +import java.util.Map; +import java.util.Set; + +import static org.junit.Assert.*; + +public class PathMaskCheckerTest +{ + + @Test + public void extractGroupIdPath() throws Exception + { + List> metadataFiles = List.of( + Map.entry("com/github/fge/msg-simple/maven-metadata.xml", "com/github/fge/"), + Map.entry("org/jboss/eap/jboss-eap-parent/maven-metadata.xml", "org/jboss/eap/"), + Map.entry("org/apache/lucene/lucene-core/maven-metadata.xml", "org/apache/lucene/"), + Map.entry("org/wildfly/security/wildfly-elytron/maven-metadata.xml", "org/wildfly/security/"), + Map.entry("io/dropwizard/metrics/metrics-core/maven-metadata.xml", "io/dropwizard/metrics/"), + Map.entry("org/jboss/spec/javax/el/jboss-el-api_3.0_spec/maven-metadata.xml", "org/jboss/spec/javax/el/") + ); + + for (var entry : metadataFiles) + { + assertEquals( entry.getValue(), PathMaskChecker.extractGroupIdPath(entry.getKey()) ); + } + } + + @Test + public void checkListingMask() throws Exception + { + HostedRepository hostedRepository = new HostedRepository( + "mvn-hosted" + ); + + RemoteRepository mrrcRepo = new RemoteRepository( + "mrrc-ga", + "http://example.url" + ); + mrrcRepo.setPathMaskPatterns( + Set.of("r|.+[-.]redhat[-_]\\d+.*|") + ); + + RemoteRepository repositoryMatched = new RemoteRepository( + "koji-org.infinispan-infinispan-parent-9.4.2.Final_redhat_00001-2", + "http://example.url" + ); + repositoryMatched.setPathMaskPatterns( + Set.of("r|org\\/infinispan\\/.+\\/9.4.2.Final-redhat-00001\\/.+|", + "org/infinispan/infinispan-query-dsl/maven-metadata.xml", + "r|org\\/infinispan\\/server\\/.+\\/9.4.2.Final-redhat-00001\\/.+|")); + + RemoteRepository repositoryUnMatched = new RemoteRepository( + "koji-org.jboss.eap-jboss-eap-parent-7.2.0.GA_redhat_00002-2", + "http://example.url" + ); + repositoryUnMatched.setPathMaskPatterns( + Set.of("r|org\\/jboss\\/eap\\/.+\\/7.2.0.GA-redhat-00002\\/.+|", + "org/jboss/eap/jboss-eap-parent/maven-metadata.xml")); + + RemoteRepository repositoryWithMultipleGroupIds = new RemoteRepository( + "koji-com.sun.mail-all-1.6.1.redhat_1-1", + "http://example.url" + ); + repositoryWithMultipleGroupIds.setPathMaskPatterns( + Set.of("javax/mail/javax.mail-api/maven-metadata.xml", + "com/sun/mail/javax.mail-api/maven-metadata.xml", + "r|javax\\/mail\\/.+\\/1.6.1.redhat-1\\/.+|", + "r|com\\/sun\\/mail\\/.+\\/1.6.1.redhat-1\\/.+|")); + + assertTrue(PathMaskChecker.checkListingMask(repositoryMatched, "org/")); + assertTrue(PathMaskChecker.checkListingMask(repositoryMatched, "org/infinispan/")); + assertTrue(PathMaskChecker.checkListingMask(repositoryMatched, "org/infinispan/infinispan-component-annotations/")); + assertTrue(PathMaskChecker.checkListingMask(repositoryWithMultipleGroupIds, "com/sun/mail/")); + assertTrue(PathMaskChecker.checkListingMask(repositoryWithMultipleGroupIds, "javax/mail/")); + assertFalse(PathMaskChecker.checkListingMask(repositoryUnMatched, "org/infinispan/")); + + assertTrue(PathMaskChecker.checkListingMask(hostedRepository, "org/infinispan/")); + assertTrue(PathMaskChecker.checkListingMask(mrrcRepo, "org/infinispan/")); + } + +} diff --git a/core/src/main/java/org/commonjava/indy/core/content/PathMaskChecker.java b/core/src/main/java/org/commonjava/indy/core/content/PathMaskChecker.java index 8ed97782ef..4be7f58416 100644 --- a/core/src/main/java/org/commonjava/indy/core/content/PathMaskChecker.java +++ b/core/src/main/java/org/commonjava/indy/core/content/PathMaskChecker.java @@ -19,7 +19,11 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import java.util.Arrays; +import java.util.List; +import java.util.Objects; import java.util.Set; +import java.util.stream.Collectors; public class PathMaskChecker { @@ -71,13 +75,34 @@ public static boolean checkListingMask( final ArtifactStore store, final String return true; } - for ( String pattern : maskPatterns ) + // if the pattern contains the metadata path, let's try to extract the groupId to filter the repos. + List metadataPatterns = maskPatterns.stream() + .filter(pattern -> pattern.endsWith("maven-metadata.xml")) + .collect( Collectors.toList() ); + + if ( metadataPatterns.isEmpty() ) { - if ( isRegexPattern( pattern ) ) + for ( String pattern : maskPatterns ) + { + if ( isRegexPattern( pattern ) ) + { + // if there is a regexp pattern we cannot check presence of directory listing, because we would have to + // check only the beginning of the regexp and that's impossible, so we have to assume that the path is + // present + return true; + } + } + } + else + { + boolean matches = metadataPatterns.stream() + .map(pattern -> extractGroupIdPath(pattern)) + .filter( Objects::nonNull ) + .anyMatch(groupIdPath -> path.startsWith( groupIdPath ) || groupIdPath.startsWith( path ) ); + + if ( matches ) { - // if there is a regexp pattern we cannot check presence of directory listing, because we would have to - // check only the beginning of the regexp and that's impossible, so we have to assume that the path is - // present + logger.trace( "Checking mask in: {}, pattern with groupId path. - MATCH.", store.getName() ); return true; } } @@ -96,6 +121,20 @@ public static boolean checkListingMask( final ArtifactStore store, final String return false; } + public static String extractGroupIdPath(String metadataPath) + { + if (metadataPath == null || !metadataPath.endsWith("maven-metadata.xml")) + { + return null; + } + + // Need at least groupId/artifactId/filename + String[] parts = metadataPath.split("/"); + if (parts.length < 3) return null; + + return String.join("/", Arrays.copyOf(parts, parts.length - 2)) + "/"; + } + public static boolean checkMavenMetadataMask( final ArtifactStore store, final String path ) { Set maskPatterns = store.getPathMaskPatterns();