package org.codehaus.mojo.setup.security; /* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you 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 java.util.Collections; import org.apache.maven.artifact.versioning.InvalidVersionSpecificationException; import org.apache.maven.artifact.versioning.VersionRange; import org.apache.maven.plugin.MojoExecutionException; import org.apache.maven.plugin.MojoFailureException; import org.apache.maven.shared.invoker.DefaultInvocationRequest; import org.apache.maven.shared.invoker.InvocationOutputHandler; import org.apache.maven.shared.invoker.InvocationRequest; import org.apache.maven.shared.invoker.InvocationResult; import org.apache.maven.shared.invoker.Invoker; import org.apache.maven.shared.invoker.MavenInvocationException; import org.codehaus.mojo.setup.AbstractSetupMojo; import org.codehaus.mojo.setup.SetupManager; import org.codehaus.plexus.util.StringUtils; /** * Configure a settings-security.xml file according to <a * href="http://maven.apache.org/guides/mini/guide-encryption.html">How to create a master password</a> * This plugin doesn't require a template. Providing a password is enough * * <p> * Default template filename: <code>settings-security.xml</code><br/> * Properties filename: <code>settings-security.properties</code><br/> * Requires: <code>Maven 2.1.0</code> * </p> * * @goal settings-security * @author Robert Scholte * @since 1.0.0 * */ public class SettingsSecuritySetupMojo extends AbstractSetupMojo { protected static final String DEFAULT_TEMPLATE_FILENAME = "settings-security.xml"; protected static final String PROPERTIES_FILENAME = "settings-security.properties"; /** * @component */ private Invoker invoker; /** * @component role-hint="settings-security" */ private SetupManager fileProcessor; /** * Define the master-password, which will be encrypted and added to the settings-security.xml * A master-password is required to support encrypted passwords in other settings files * * @parameter expression="${password}" */ private String password; /** * {@inheritDoc} * @since 1.0.0 */ @Override protected VersionRange getMavenVersionRange() throws InvalidVersionSpecificationException { return VersionRange.createFromVersionSpec( "[2.1.0,)" ); } /** * {@inheritDoc} * @since 1.0.0 */ @Override public void preProcess() throws MojoExecutionException, MojoFailureException { if ( StringUtils.isNotEmpty( password ) ) { InvocationRequest request = new DefaultInvocationRequest(); request.setGoals( Collections.singletonList( "--encrypt-master-password " + password ) ); request.setProperties( getSession().getUserProperties() ); final StringBuffer encryptedMasterPassword = new StringBuffer(); request.setOutputHandler( new InvocationOutputHandler() { public void consumeLine( String line ) { encryptedMasterPassword.append( line ); } } ); try { InvocationResult result = invoker.execute( request ); if ( result.getExitCode() == 0 ) { getSetupRequest().getAdditionalProperties().put( "master", encryptedMasterPassword.toString() ); } else if ( result.getExecutionException() == null ) { throw new MojoExecutionException( "Failed to encrypt master password" ); } else { throw new MojoExecutionException( result.getExecutionException().getMessage() ); } } catch ( MavenInvocationException e ) { throw new MojoExecutionException( e.getMessage() ); } } } /** * {@inheritDoc} * @since 1.0.0 */ @Override public SetupManager getSetupManager() { return fileProcessor; } /** * {@inheritDoc} * @since 1.0.0 */ @Override protected String getPropertiesFilename() { return PROPERTIES_FILENAME; } /** * {@inheritDoc} * @since 1.0.0 */ @Override protected String getDefaultTemplateFilename() { return DEFAULT_TEMPLATE_FILENAME; } }