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