This is an automated email from the ASF dual-hosted git repository. sor pushed a commit to branch MSHARED-773 in repository https://gitbox.apache.org/repos/asf/maven-archiver.git
commit 99b4c6bd33bec39364da90530f2070b1629f8c4b Author: Christian Stein <sormu...@gmail.com> AuthorDate: Sat Nov 17 09:30:45 2018 +0100 Fail on invalid 'Automatic-Module-Name' in MANIFEST Maven Archiver now fails with a `ManifestException` when an invalid `Automatic-Module-Name` is detected within the `META-INF/MANIFEST.MF` entries. For details see https://sormuras.github.io/blog/2018-11-16-invalid-automatic-module-names https://issues.apache.org/jira/projects/MSHARED/issues/MSHARED-773 --- .../org/apache/maven/archiver/MavenArchiver.java | 15 ++++++ .../apache/maven/archiver/MavenArchiverTest.java | 53 ++++++++++++++++++++++ 2 files changed, 68 insertions(+) diff --git a/src/main/java/org/apache/maven/archiver/MavenArchiver.java b/src/main/java/org/apache/maven/archiver/MavenArchiver.java index 66d9353..f4f2636 100644 --- a/src/main/java/org/apache/maven/archiver/MavenArchiver.java +++ b/src/main/java/org/apache/maven/archiver/MavenArchiver.java @@ -38,6 +38,7 @@ import org.codehaus.plexus.interpolation.StringSearchInterpolator; import org.codehaus.plexus.interpolation.ValueSource; import org.apache.maven.shared.utils.StringUtils; +import javax.lang.model.SourceVersion; import java.io.File; import java.io.IOException; import java.util.ArrayList; @@ -91,6 +92,11 @@ public class MavenArchiver ARTIFACT_EXPRESSION_PREFIXES = artifactExpressionPrefixes; } + static boolean isValidModuleName( String name ) + { + return SourceVersion.isName( name ); + } + private JarArchiver archiver; private File archiveFile; @@ -645,6 +651,15 @@ public class MavenArchiver // "Forced build is disabled, but disabling the forced mode isn't supported by the archiver." ); } + String automaticModuleName = manifest.getMainSection().getAttributeValue( "Automatic-Module-Name" ); + if ( automaticModuleName != null ) + { + if ( !isValidModuleName( automaticModuleName ) ) + { + throw new ManifestException( "Invalid automatic module name: '" + automaticModuleName + "'" ); + } + } + // create archive archiver.createArchive(); } diff --git a/src/test/java/org/apache/maven/archiver/MavenArchiverTest.java b/src/test/java/org/apache/maven/archiver/MavenArchiverTest.java index 4c0d799..6803f24 100644 --- a/src/test/java/org/apache/maven/archiver/MavenArchiverTest.java +++ b/src/test/java/org/apache/maven/archiver/MavenArchiverTest.java @@ -83,6 +83,30 @@ public class MavenArchiverTest } @Test + public void testInvalidModuleNames() + { + assertFalse( MavenArchiver.isValidModuleName( "" ) ); + assertFalse( MavenArchiver.isValidModuleName( "." ) ); + assertFalse( MavenArchiver.isValidModuleName( "dash-is-invalid" ) ); + assertFalse( MavenArchiver.isValidModuleName( "plus+is+invalid" ) ); + assertFalse( MavenArchiver.isValidModuleName( "colon:is:invalid" ) ); + assertFalse( MavenArchiver.isValidModuleName( "new.class" ) ); + assertFalse( MavenArchiver.isValidModuleName( "123.at.start.is.invalid" ) ); + assertFalse( MavenArchiver.isValidModuleName( "digit.at.123start.is.invalid" ) ); + } + + @Test + public void testValidModuleNames() + { + assertTrue( MavenArchiver.isValidModuleName( "a" ) ); + assertTrue( MavenArchiver.isValidModuleName( "a.b" ) ); + assertTrue( MavenArchiver.isValidModuleName( "a_b" ) ); + assertTrue( MavenArchiver.isValidModuleName( "trailing0.digits123.are456.ok789" ) ); + assertTrue( MavenArchiver.isValidModuleName( "UTF8.chars.are.okay.äëïöüẍ" ) ); + assertTrue( MavenArchiver.isValidModuleName( "ℤ€ℕ" ) ); + } + + @Test public void testGetManifestExtensionList() throws Exception { @@ -500,6 +524,7 @@ public class MavenArchiverTest Map<String, String> manifestEntries = new HashMap<String, String>(); manifestEntries.put( "foo", "bar" ); manifestEntries.put( "first-name", "olivier" ); + manifestEntries.put( "Automatic-Module-Name", "org.apache.maven.archiver" ); manifestEntries.put( "keyWithEmptyValue", null ); config.setManifestEntries( manifestEntries ); @@ -532,6 +557,7 @@ public class MavenArchiverTest assertEquals( "bar", manifest.get( new Attributes.Name( "foo" ) ) ); assertEquals( "olivier", manifest.get( new Attributes.Name( "first-name" ) ) ); + assertEquals( "org.apache.maven.archiver", manifest.getValue( "Automatic-Module-Name" ) ); assertEquals( System.getProperty( "java.version" ), manifest.get( new Attributes.Name( "Build-Jdk" ) ) ); assertEquals( System.getProperty( "user.name" ), manifest.get( new Attributes.Name( "Built-By" ) ) ); @@ -545,6 +571,33 @@ public class MavenArchiverTest } @Test + public void testManifestWithInvalidAutomaticModuleNameThrowsOnCreateArchive() + throws Exception + { + File jarFile = new File( "target/test/dummy.jar" ); + JarArchiver jarArchiver = getCleanJarArchiver( jarFile ); + + MavenArchiver archiver = getMavenArchiver( jarArchiver ); + + MavenSession session = getDummySession(); + MavenProject project = getDummyProject(); + MavenArchiveConfiguration config = new MavenArchiveConfiguration(); + + Map<String, String> manifestEntries = new HashMap<String, String>(); + manifestEntries.put( "Automatic-Module-Name", "123.in-valid.new.name" ); + config.setManifestEntries( manifestEntries ); + + try + { + archiver.createArchive( session, project, config ); + } + catch ( ManifestException e ) + { + assertEquals( "Invalid automatic module name: '123.in-valid.new.name'", e.getMessage() ); + } + } + + @Test public void testCreatedByManifestEntryWithoutMavenVersion() throws Exception {