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    }