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.ArrayList;
019 import java.util.Collections;
020 import java.util.List;
021 import java.util.Properties;
022
023 import org.apache.commons.lang.StringUtils;
024 import org.apache.maven.plugin.AbstractMojo;
025 import org.apache.maven.plugin.MojoExecutionException;
026 import org.apache.maven.project.MavenProject;
027 import org.jasypt.util.text.BasicTextEncryptor;
028
029 /**
030 * Inspect project and system properties for any keys ending with <code>endsWith</code>. Any matching properties are
031 * assumed to be encrypted. They are decrypted and stored as project properties minus the <code>endsWith</code> suffix.
032 *
033 * @goal decryptall
034 */
035 public class DecryptAllPropertiesMojo extends AbstractMojo {
036
037 /**
038 * @parameter default-value="${project}"
039 * @required
040 * @readonly
041 */
042 private MavenProject project;
043
044 /**
045 * The pattern for matching properties in need of decryption
046 *
047 * @parameter expression="${properties.endsWith}" default-value=".encrypted"
048 * @required
049 */
050 private String endsWith;
051
052 /**
053 * If true the plain text decrypted values are displayed to the console.
054 *
055 * @parameter expression="${properties.show}" default-value="false"
056 * @required
057 */
058 private boolean show;
059
060 /**
061 * The password for decrypting property values. This same password must have been used to encrypt them.
062 *
063 * @parameter expression="${properties.password}"
064 * @required
065 */
066 private String password;
067
068 @Override
069 public void execute() throws MojoExecutionException {
070 BasicTextEncryptor encryptor = new BasicTextEncryptor();
071 encryptor.setPassword(password);
072 Properties props = project.getProperties();
073 List<String> keys = new ArrayList<String>(props.stringPropertyNames());
074 Collections.sort(keys);
075 for (String key : keys) {
076 boolean decrypt = key.endsWith(endsWith);
077 if (!decrypt) {
078 continue;
079 }
080 String value = getProperty(key);
081 if (StringUtils.isBlank(value)) {
082 getLog().info("Skipping blank property " + key);
083 continue;
084 }
085 String newValue = encryptor.decrypt(value);
086 int length = endsWith.length();
087 String newKey = key.substring(0, key.length() - length);
088 props.setProperty(newKey, newValue);
089 if (show) {
090 getLog().info("Setting " + newKey + "=" + newValue + " - " + value);
091 } else {
092 getLog().info("Setting " + newKey);
093 }
094 }
095 }
096
097 protected String getProperty(String key) {
098 String sys = System.getProperty(key);
099 String proj = project.getProperties().getProperty(key);
100 if (!StringUtils.isBlank(sys)) {
101 return sys;
102 } else {
103 return proj;
104 }
105 }
106 }