All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.codehaus.mojo.keytool.GenkeyMojo Maven / Gradle / Ivy

Go to download

A plugin that wraps the keytool program bundled with Sun's Java SDK. Allows to manipulate keystores.

There is a newer version: 1.7
Show newest version
package org.codehaus.mojo.keytool;

/*
 * Copyright 2001-2005 The Apache Software Foundation.
 *
 * Licensed under the Apache License, Version 2.0 (the "License" );
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

import org.apache.commons.lang.SystemUtils;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugin.logging.Log;
import org.codehaus.plexus.util.StringUtils;
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.StreamConsumer;

import java.io.File;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.StringTokenizer;

/**
 * Generates a keystore.
 * 

* Implemented as a wrapper around the SDK keytool -genkey command. *

 * -genkey   [-v] [-protected]
 * [-alias <alias>]
 * [-keyalg <keyalg>] [-keysize <keysize>]
 * [-sigalg <sigalg>] [-dname <dname>]
 * [-validity <valDays>] [-keypass <keypass>]
 * [-keystore <keystore>] [-storepass <storepass>]
 * [-storetype <storetype>] [-providerName <name>]
 * [-providerClass <provider_class_name> [-providerArg <arg>]] ...
 * 
* * @author Jerome Lacoste * @version $Id: $ * @goal genkey * @phase package * @requiresProject * @todo refactor the common code with javadoc plugin * @see keystore documentation. */ public class GenkeyMojo extends AbstractKeyToolMojo { /** * See options. * * @parameter expression="${keyalg}" */ private String keyalg; /** * See options. * * @parameter expression="${keysize}" */ private String keysize; /** * See options. * * @parameter expression="${sigalg}" */ private String sigalg; /** * See options. * * @parameter expression="${storetype}" */ private String storetype; /** * See options. * * @parameter expression="${storepass}" */ private String storepass; /** * See options. * * @parameter expression="${keypass}" */ private String keypass; /** * See options. * * @parameter expression="${validity}" */ private String validity; /** * See options. * * @parameter expression="${dname}" * @todo split this up? */ private String dname; /** * See options. * * @parameter expression="${alias}" */ private String alias; /** * Enable verbose * See options. * * @parameter expression="${verbose}" default-value="false" */ private boolean verbose; public void execute() throws MojoExecutionException { List arguments = new ArrayList(); Commandline commandLine = new Commandline(); commandLine.setExecutable( getKeytoolPath() ); arguments.add( "-genkey" ); addArgIf( arguments, this.verbose, "-v" ); // I believe Commandline to add quotes where appropriate, although I haven't tested it enough. addArgIfNotEmpty( arguments, "-dname", this.dname ); addArgIfNotEmpty( arguments, "-alias", this.alias ); addArgIfNotEmpty( arguments, "-keypass", this.keypass ); addArgIfNotEmpty( arguments, "-keystore", this.keystore ); addArgIfNotEmpty( arguments, "-storepass", this.storepass ); addArgIfNotEmpty( arguments, "-validity", this.validity ); addArgIfNotEmpty( arguments, "-keyalg", this.keyalg ); addArgIfNotEmpty( arguments, "-keysize", this.keysize ); addArgIfNotEmpty( arguments, "-sigalg", this.sigalg ); addArgIfNotEmpty( arguments, "-storetype", this.storetype ); for ( Iterator it = arguments.iterator(); it.hasNext(); ) { commandLine.createArgument().setValue( it.next().toString() ); } if ( workingDirectory != null ) { commandLine.setWorkingDirectory( workingDirectory.getAbsolutePath() ); } createParentDirIfNecessary( keystore ); getLog().debug( "Executing: " + commandLine ); // jarsigner may ask for some input if the parameters are missing or incorrect. // This should take care of it and make it fail gracefully final InputStream inputStream = new InputStream() { public int read() { return -1; } }; StreamConsumer outConsumer = new StreamConsumer() { public void consumeLine( String line ) { getLog().info( line ); } }; final StringBuffer errBuffer = new StringBuffer(); StreamConsumer errConsumer = new StreamConsumer() { public void consumeLine( String line ) { getLog().warn( line ); errBuffer.append( line ); } }; try { int result = executeCommandLine( commandLine, inputStream, outConsumer, errConsumer ); if ( result != 0 ) { throw new MojoExecutionException( "Result of " + commandLine + " execution is: \'" + result + "\': " + errBuffer.toString() + "." ); } } catch ( CommandLineException e ) { throw new MojoExecutionException( "command execution failed", e ); } } private void createParentDirIfNecessary( final String file ) { if ( file != null ) { final File fileDir = new File( file ).getParentFile(); if ( fileDir != null ) { // not a relative path boolean mkdirs = fileDir.mkdirs(); getLog().debug( "mdkirs: " + mkdirs + " " + fileDir ); } } } // taken from JavadocReport then slightly refactored // should probably share with other plugins that use $JAVA_HOME/bin tools /** * Get the path of jarsigner tool depending the OS. * * @return the path of the jarsigner tool */ private String getKeytoolPath() { return getJDKCommandPath( "keytool", getLog() ); } private static String getJDKCommandPath( String command, Log logger ) { String path = getJDKCommandExe( command ).getAbsolutePath(); logger.debug( command + " executable=[" + path + "]" ); return path; } private static File getJDKCommandExe( String command ) { String fullCommand = command + ( SystemUtils.IS_OS_WINDOWS ? ".exe" : "" ); File exe; // For IBM's JDK 1.2 if ( SystemUtils.IS_OS_AIX ) { exe = new File( SystemUtils.getJavaHome() + "/../sh", fullCommand ); } else if ( SystemUtils.IS_OS_MAC_OSX ) // what about IS_OS_MAC_OS ?? { exe = new File( SystemUtils.getJavaHome() + "/bin", fullCommand ); } else { exe = new File( SystemUtils.getJavaHome() + "/../bin", fullCommand ); } return exe; } // Helper methods. Could/should be shared e.g. with JavadocReport /** * Convenience method to add an argument to the command line * conditionally based on the given flag. * * @param arguments * @param b the flag which controls if the argument is added or not. * @param value the argument value to be added. */ private void addArgIf( List arguments, boolean b, String value ) { if ( b ) { arguments.add( value ); } } /** * Convenience method to add an argument to the command line * if the the value is not null or empty. *

* Moreover, the value could be comma separated. * * @param arguments * @param key the argument name. * @param value the argument value to be added. * @see #addArgIfNotEmpty(java.util.List,String,String,boolean) */ private void addArgIfNotEmpty( List arguments, String key, String value ) { // FIXME we need to improve this API // addArgIfNotEmpty( arguments, key, value, false ); addArgIfNotEmpty2( arguments, key, value, false ); } /** * Convenience method to add an argument to the command line * if the the value is not null or empty. *

* Moreover, the value could be comma separated. * * @param arguments * @param key the argument name. * @param value the argument value to be added. * @param ignored */ private void addArgIfNotEmpty2( List arguments, String key, String value, boolean ignored ) { if ( !StringUtils.isEmpty( value ) ) { arguments.add( key ); arguments.add( value ); } } /** * Convenience method to add an argument to the command line * if the the value is not null or empty. *

* Moreover, the value could be comma separated. * * @param arguments * @param key the argument name. * @param value the argument value to be added. * @param repeatKey repeat or not the key in the command line */ private void addArgIfNotEmpty( List arguments, String key, String value, boolean repeatKey ) { if ( !StringUtils.isEmpty( value ) ) { arguments.add( key ); StringTokenizer token = new StringTokenizer( value, "," ); while ( token.hasMoreTokens() ) { String current = token.nextToken().trim(); if ( !StringUtils.isEmpty( current ) ) { arguments.add( current ); if ( token.hasMoreTokens() && repeatKey ) { arguments.add( key ); } } } } } // // methods used for tests purposes - allow mocking and simulate automatic setters // protected int executeCommandLine( Commandline commandLine, InputStream inputStream, StreamConsumer stream1, StreamConsumer stream2 ) throws CommandLineException { return CommandLineUtils.executeCommandLine( commandLine, inputStream, stream1, stream2 ); } public void setKeypass( String keypass ) { this.keypass = keypass; } public void setStorepass( String storepass ) { this.storepass = storepass; } public void setAlias( String alias ) { this.alias = alias; } public void setKeyalg( String keyalg ) { this.keyalg = keyalg; } public void setSigalg( String sigalg ) { this.sigalg = sigalg; } public void setKeysize( String keysize ) { this.keysize = keysize; } public void setStoretype( String storetype ) { this.storetype = storetype; } public void setValidity( String validity ) { this.validity = validity; } public void setDname( String dname ) { this.dname = dname; } public void setVerbose( boolean verbose ) { this.verbose = verbose; } }





© 2015 - 2024 Weber Informatics LLC | Privacy Policy