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
     {

Reply via email to