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 * For example, the value for the property "dba.password.encrypted" will be decrypted and stored as "dba.password"
033 *
034 * @goal decryptall
035 */
036 public class DecryptAllPropertiesMojo extends AbstractMojo {
037
038 /**
039 * @parameter default-value="${project}"
040 * @required
041 * @readonly
042 */
043 private MavenProject project;
044
045 /**
046 * If true, the plugin will emit no logging information
047 *
048 * @parameter expression="${properties.quiet}" default-value="false"
049 * @required
050 */
051 private boolean quiet;
052
053 /**
054 * The pattern for matching properties in need of decryption
055 *
056 * @parameter expression="${properties.endsWith}" default-value=".encrypted"
057 * @required
058 */
059 private String endsWith;
060
061 /**
062 * If true the plain text decrypted values are displayed to the console.
063 *
064 * @parameter expression="${properties.show}" default-value="false"
065 * @required
066 */
067 private boolean show;
068
069 /**
070 * The password for decrypting property values. This same password must have been used to encrypt them.
071 *
072 * @parameter expression="${properties.password}"
073 * @required
074 */
075 private String password;
076
077 @Override
078 public void execute() throws MojoExecutionException {
079 BasicTextEncryptor encryptor = new BasicTextEncryptor();
080 encryptor.setPassword(password);
081 Properties props = project.getProperties();
082 List<String> keys = new ArrayList<String>(props.stringPropertyNames());
083 Collections.sort(keys);
084 for (String key : keys) {
085 boolean decrypt = key.endsWith(endsWith);
086 if (!decrypt) {
087 continue;
088 }
089 String value = getProperty(key);
090 if (StringUtils.isBlank(value) && !quiet) {
091 getLog().info("Skipping blank property " + key);
092 continue;
093 }
094 String newValue = encryptor.decrypt(value);
095 int length = endsWith.length();
096 String newKey = key.substring(0, key.length() - length);
097 props.setProperty(newKey, newValue);
098 if (quiet) {
099 continue;
100 }
101 if (show) {
102 getLog().info("Setting " + newKey + "=" + newValue + " - " + value);
103 } else {
104 getLog().info("Setting " + newKey);
105 }
106 }
107 }
108
109 protected String getProperty(String key) {
110 String sys = System.getProperty(key);
111 String proj = project.getProperties().getProperty(key);
112 if (!StringUtils.isBlank(sys)) {
113 return sys;
114 } else {
115 return proj;
116 }
117 }
118
119 public boolean isQuiet() {
120 return quiet;
121 }
122
123 public void setQuiet(boolean quiet) {
124 this.quiet = quiet;
125 }
126
127 public String getEndsWith() {
128 return endsWith;
129 }
130
131 public void setEndsWith(String endsWith) {
132 this.endsWith = endsWith;
133 }
134
135 public boolean isShow() {
136 return show;
137 }
138
139 public void setShow(boolean show) {
140 this.show = show;
141 }
142
143 public String getPassword() {
144 return password;
145 }
146
147 public void setPassword(String password) {
148 this.password = password;
149 }
150
151 public MavenProject getProject() {
152 return project;
153 }
154 }