001 /**
002 * Copyright 2009-2012 The Kuali Foundation
003 *
004 * Licensed under the Educational Community License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 * http://www.opensource.org/licenses/ecl2.php
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 * See the License for the specific language governing permissions and
014 * limitations under the License.
015 */
016 package org.codehaus.mojo.properties;
017
018 import java.util.Properties;
019
020 import org.apache.commons.lang.StringUtils;
021 import org.apache.maven.plugin.AbstractMojo;
022 import org.apache.maven.plugin.MojoExecutionException;
023 import org.apache.maven.project.MavenProject;
024 import org.jasypt.util.text.BasicTextEncryptor;
025
026 /**
027 * Generate encrypted values for the specified system or project properties.
028 *
029 * @goal encrypt
030 */
031 public class EncryptPropertiesMojo extends AbstractMojo {
032
033 /**
034 * @parameter default-value="${project}"
035 * @required
036 * @readonly
037 */
038 private MavenProject project;
039
040 /**
041 * The list of properties containing values to encrypt
042 *
043 * @parameter
044 * @required
045 */
046 private String[] properties;
047
048 /**
049 * The encrypted value for the properties are stored under their original property key with this text appended to
050 * the end.
051 *
052 * eg "database.password" is stored as "database.password.encrypted"
053 *
054 * @parameter expression="${properties.suffix}" default-value="encrypted"
055 * @required
056 */
057 private String suffix;
058
059 /**
060 * If true, the plain text values being encrypted are displayed to the console.
061 *
062 * @parameter expression="${properties.show}" default-value="false"
063 * @required
064 */
065 private boolean show;
066
067 /**
068 *
069 * The password for encrypting property values. This same password can be used to to decrypt the encrypted values.
070 *
071 * @parameter expression="${properties.password}"
072 * @required
073 */
074 private String password;
075
076 @Override
077 public void execute() throws MojoExecutionException {
078 BasicTextEncryptor encryptor = new BasicTextEncryptor();
079 encryptor.setPassword(password);
080 Properties props = project.getProperties();
081 for (String key : properties) {
082 String value = getProperty(key);
083 if (StringUtils.isBlank(value)) {
084 getLog().info("Skipping " + key);
085 continue;
086 }
087 String newValue = encryptor.encrypt(value);
088 String newKey = key + "." + suffix;
089 props.setProperty(newKey, newValue);
090 if (show) {
091 getLog().info("Setting " + newKey + "=" + newValue + " - " + value);
092 } else {
093 getLog().info("Setting " + newKey + "=" + newValue);
094 }
095 }
096 }
097
098 protected String getProperty(String key) {
099 String sys = System.getProperty(key);
100 String proj = project.getProperties().getProperty(key);
101 if (!StringUtils.isBlank(sys)) {
102 return sys;
103 } else {
104 return proj;
105 }
106
107 }
108
109 public String[] getProperties() {
110 return properties;
111 }
112
113 public void setProperties(String[] properties) {
114 this.properties = properties;
115 }
116 }