You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by dk...@apache.org on 2007/02/27 22:16:01 UTC

svn commit: r512412 - in /maven/plugins/trunk/maven-gpg-plugin: pom.xml src/main/java/org/apache/maven/plugin/gpg/GpgSignAttachedMojo.java

Author: dkulp
Date: Tue Feb 27 13:16:01 2007
New Revision: 512412

URL: http://svn.apache.org/viewvc?view=rev&rev=512412
Log:
More for MGPG-1
* Prefix properties with "gpg."
* Add gpg.skip
* Add --batch-mode support
* Query password once per project (instead of once per artifact)


Modified:
    maven/plugins/trunk/maven-gpg-plugin/pom.xml
    maven/plugins/trunk/maven-gpg-plugin/src/main/java/org/apache/maven/plugin/gpg/GpgSignAttachedMojo.java

Modified: maven/plugins/trunk/maven-gpg-plugin/pom.xml
URL: http://svn.apache.org/viewvc/maven/plugins/trunk/maven-gpg-plugin/pom.xml?view=diff&rev=512412&r1=512411&r2=512412
==============================================================================
--- maven/plugins/trunk/maven-gpg-plugin/pom.xml (original)
+++ maven/plugins/trunk/maven-gpg-plugin/pom.xml Tue Feb 27 13:16:01 2007
@@ -47,6 +47,12 @@
       <version>2.0</version>
     </dependency>
     <dependency>
+      <groupId>org.apache.maven</groupId>
+      <artifactId>maven-settings</artifactId>
+      <version>2.0</version>
+    </dependency>
+
+    <dependency>
       <groupId>commons-lang</groupId>
       <artifactId>commons-lang</artifactId>
       <version>2.2</version>

Modified: maven/plugins/trunk/maven-gpg-plugin/src/main/java/org/apache/maven/plugin/gpg/GpgSignAttachedMojo.java
URL: http://svn.apache.org/viewvc/maven/plugins/trunk/maven-gpg-plugin/src/main/java/org/apache/maven/plugin/gpg/GpgSignAttachedMojo.java?view=diff&rev=512412&r1=512411&r2=512412
==============================================================================
--- maven/plugins/trunk/maven-gpg-plugin/src/main/java/org/apache/maven/plugin/gpg/GpgSignAttachedMojo.java (original)
+++ maven/plugins/trunk/maven-gpg-plugin/src/main/java/org/apache/maven/plugin/gpg/GpgSignAttachedMojo.java Tue Feb 27 13:16:01 2007
@@ -28,16 +28,21 @@
 import org.apache.maven.artifact.handler.manager.ArtifactHandlerManager;
 import org.apache.maven.artifact.handler.ArtifactHandler;
 import org.apache.maven.artifact.handler.DefaultArtifactHandler;
+import org.apache.maven.settings.Settings;
 import org.codehaus.plexus.util.cli.CommandLineException;
 import org.codehaus.plexus.util.cli.CommandLineUtils;
 import org.codehaus.plexus.util.cli.Commandline;
 import org.codehaus.plexus.util.cli.DefaultConsumer;
 import org.codehaus.plexus.util.FileUtils;
 
+import java.io.BufferedReader;
 import java.io.ByteArrayInputStream;
 import java.io.File;
 import java.io.InputStream;
 import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.PushbackInputStream;
+import java.util.Arrays;
 import java.util.Iterator;
 import java.util.List;
 import java.util.ArrayList;
@@ -49,6 +54,7 @@
  *
  * @author Jason van Zyl
  * @author Jason Dillon
+ * @author Daniel Kulp
  * @goal sign
  * @phase verify
  */
@@ -60,14 +66,14 @@
     /**
      * The passphrase to use when signing.
      *
-     * @parameter expression="${passphrase}"
+     * @parameter expression="${gpg.passphrase}"
      */
     private String passphrase;
 
     /**
      * The "name" of the key to sign with.  Passed to gpg as --local-user.
      * 
-     * @parameter expression="${keyname}"
+     * @parameter expression="${gpg.keyname}"
      */
     private String keyname;
 
@@ -76,10 +82,18 @@
      * Passes --use-agent or --no-use-agent to gpg.   If using an agent,
      * the password is optional as the agent will provide it.
      * 
-     * @parameter expression="${useAgent}" default-value="false"
+     * @parameter expression="${gpg.useagent}" default-value="false"
      * @required
      */
     private boolean useAgent;
+    
+    /**
+     * Skip doing the gpg signing
+     * 
+     * @parameter expression="${gpg.skip}" default-value="false"
+     * @required
+     */
+    private boolean skip;
 
 
     /**
@@ -108,12 +122,42 @@
      * @readonly
      */
     private ArtifactHandlerManager artifactHandlerManager;
+    
+    /**
+     * @parameter expression="${settings}"
+     * @required
+     * @readonly
+     */
+    protected Settings settings;
 
 
     public void execute()
         throws MojoExecutionException
     {
 
+        if ( skip ) 
+        {
+            //We're skipping the signing stuff
+            return;
+        }
+        
+        if ( !useAgent && null == passphrase )
+        {
+            if ( !settings.isInteractiveMode() )
+            {
+                throw new MojoExecutionException("Cannot obtain passphrase in batch mode");
+            }
+            try 
+            {
+                getPassphrase();
+            }
+            catch (IOException e) 
+            {
+                throw new MojoExecutionException("Exception reading password", e);
+            }
+        }
+        
+        
         // ----------------------------------------------------------------------------
         // What we need to generateSignatureForArtifact here
         // ----------------------------------------------------------------------------
@@ -272,4 +316,70 @@
     {
         return new File( basedir, finalName + ".jar" );
     }
+    
+    protected void getPassphrase() throws IOException
+    {
+        //TODO: with JDK 1.6, we could call System.console().readPassword("GPG Passphrase: ", null);
+        
+        System.out.print("GPG Passphrase: ");
+        MaskingThread thread = new MaskingThread();
+        thread.start();
+
+        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
+
+        passphrase = in.readLine();
+
+        // stop masking
+        thread.stopMasking();
+    }
+    
+    
+    // based on ideas from http://java.sun.com/developer/technicalArticles/Security/pwordmask/
+    class MaskingThread extends Thread
+    {
+        private volatile boolean stop;
+
+       /**
+        * Begin masking until asked to stop.
+        */
+        public void run()
+        {
+            //this needs to be high priority to make sure the characters don't
+            //really get to the screen.
+            
+            int priority = Thread.currentThread().getPriority();
+            Thread.currentThread().setPriority(Thread.MAX_PRIORITY);
+
+            try {
+                stop = false;
+                while(!stop)
+                { 
+                    //print a backspace + * to overwrite anything they type
+                    System.out.print("\010*");
+                    try
+                    {
+                        //attempt masking at this rate
+                        Thread.sleep(1);
+                    }
+                    catch (InterruptedException iex)
+                    {
+                        Thread.currentThread().interrupt();
+                        return;
+                    }
+                }
+            }
+            finally
+            {
+                // restore the original priority
+                Thread.currentThread().setPriority(priority);
+            }
+        }
+
+        /**
+         * Instruct the thread to stop masking.
+         */
+        public void stopMasking() {
+            this.stop = true;
+        }
+    }    
 }