View Javadoc
1   /**
2    * Copyright (c) 2012-2022, jcabi.com
3    * All rights reserved.
4    *
5    * Redistribution and use in source and binary forms, with or without
6    * modification, are permitted provided that the following conditions
7    * are met: 1) Redistributions of source code must retain the above
8    * copyright notice, this list of conditions and the following
9    * disclaimer. 2) Redistributions in binary form must reproduce the above
10   * copyright notice, this list of conditions and the following
11   * disclaimer in the documentation and/or other materials provided
12   * with the distribution. 3) Neither the name of the jcabi.com nor
13   * the names of its contributors may be used to endorse or promote
14   * products derived from this software without specific prior written
15   * permission.
16   *
17   * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
18   * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT
19   * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
20   * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
21   * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
22   * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
23   * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
24   * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
25   * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
26   * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
27   * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
28   * OF THE POSSIBILITY OF SUCH DAMAGE.
29   */
30  package com.jcabi.ssl.maven.plugin;
31  
32  import com.jcabi.log.Logger;
33  import java.io.File;
34  import java.io.IOException;
35  import org.apache.commons.codec.digest.DigestUtils;
36  import org.apache.maven.plugin.AbstractMojo;
37  import org.apache.maven.plugin.MojoFailureException;
38  import org.apache.maven.project.MavenProject;
39  import org.slf4j.impl.StaticLoggerBinder;
40  
41  /**
42   * Generate SSL keystore and configure in JVM.
43   *
44   * @author Yegor Bugayenko (yegor256@gmail.com)
45   * @version $Id: 67fccb6bbc46e084d037b8cb73ac576c8cec7fd5 $
46   * @since 0.5
47   * @goal keygen
48   * @phase initialize
49   */
50  public final class KeygenMojo extends AbstractMojo {
51  
52      /**
53       * Maven project.
54       * @parameter name="project" default-value="${project}"
55       * @readonly
56       * @required
57       */
58      private transient MavenProject project;
59  
60      /**
61       * Shall we skip execution?
62       * @parameter name="skip"
63       */
64      private transient boolean skip;
65  
66      /**
67       * Name of keystore.jks file.
68       * @parameter name="keystore"
69       * default-value="${project.build.directory}/keystore.jks"
70       */
71      private transient File keystore;
72  
73      /**
74       * Name of cacerts.jks file.
75       * @parameter name="cacerts"
76       * default-value="${project.build.directory}/cacerts.jks"
77       */
78      private transient File cacerts;
79  
80      /**
81       * Keystore instance.
82       */
83      private transient Keystore store;
84  
85      /**
86       * Cacerts instance.
87       */
88      private transient Cacerts truststore;
89  
90      /**
91       * Creates KeygenMojo.
92       */
93      public KeygenMojo() {
94          this(
95              null, new Keystore(DigestUtils.md5Hex(KeygenMojo.class.getName())),
96              null
97          );
98      }
99  
100     /**
101      * Creates KeygenMojo using custom KeystoreFactory.
102      * @param prj Maven project
103      * @param str Keystore instance
104      * @param crt Cacerts instance
105      */
106     public KeygenMojo(final MavenProject prj, final Keystore str,
107         final Cacerts crt) {
108         super();
109         this.project = prj;
110         this.store = str;
111         this.truststore = crt;
112     }
113 
114     /**
115      * Set skip option.
116      * @param skp Shall we skip execution?
117      */
118     public void setSkip(final boolean skp) {
119         this.skip = skp;
120     }
121 
122     /**
123      * {@inheritDoc}
124      */
125     @Override
126     public void execute() throws MojoFailureException {
127         StaticLoggerBinder.getSingleton().setMavenLog(this.getLog());
128         if (this.skip) {
129             Logger.info(this, "execution skipped because of 'skip' option");
130             return;
131         }
132         try {
133             if (this.truststore == null) {
134                 this.truststore = new Cacerts(this.cacerts);
135             }
136             if (!this.store.isActive()) {
137                 this.store.activate(this.keystore);
138                 this.truststore.imprt();
139             }
140         } catch (final IOException ex) {
141             throw new IllegalStateException(ex);
142         }
143         this.store.populate(this.project.getProperties());
144         this.truststore.populate(this.project.getProperties());
145         Logger.info(this, "Keystore is active: %s", this.store);
146     }
147 
148 }