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