1 /**
2 * Copyright (c) 2012-2013, 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.aspects.Immutable;
33 import com.jcabi.log.Logger;
34 import java.io.File;
35 import java.io.IOException;
36 import javax.validation.constraints.NotNull;
37 import lombok.EqualsAndHashCode;
38 import lombok.ToString;
39 import org.apache.commons.io.FileUtils;
40
41 /**
42 * Abstraction of {@code java.home/lib/security/cacerts} file.
43 *
44 * @author Yegor Bugayenko (yegor@tpc2.com)
45 * @version $Id$
46 * @since 0.5
47 */
48 @Immutable
49 @ToString
50 @EqualsAndHashCode(of = "store")
51 final class Cacerts {
52
53 /**
54 * Constant {@code javax.net.ssl.trustStore}.
55 */
56 private static final String TRUST = "javax.net.ssl.trustStore";
57
58 /**
59 * Constant {@code javax.net.ssl.trustStorePassword}.
60 */
61 private static final String TRUST_PWD = "javax.net.ssl.trustStorePassword";
62
63 /**
64 * Standard password of {@code cacerts} file.
65 */
66 private static final String STD_PWD = "changeit";
67
68 /**
69 * New location of the trust store.
70 */
71 private final transient String store;
72
73 /**
74 * Public ctor.
75 * @param file New location
76 * @throws IOException If fails
77 */
78 public Cacerts(@NotNull final File file) throws IOException {
79 this.store = file.getAbsolutePath();
80 final File prev = new File(
81 String.format(
82 "%s/lib/security/cacerts",
83 System.getProperty("java.home")
84 )
85 );
86 FileUtils.copyFile(prev, file);
87 Logger.info(
88 this,
89 "Existing cacerts '%s' copied to '%s' (%s)",
90 prev,
91 this.store,
92 FileUtils.byteCountToDisplaySize(this.store.length())
93 );
94 }
95
96 /**
97 * Import existing keystore content into this trust store.
98 * @throws IOException If fails
99 */
100 public void imprt() throws IOException {
101 final File keystore = new File(System.getProperty(Keystore.KEY));
102 final String pwd = System.getProperty(Keystore.KEY_PWD);
103 new Keytool(new File(this.store), Cacerts.STD_PWD).imprt(keystore, pwd);
104 System.setProperty(Cacerts.TRUST, this.store);
105 System.setProperty(Cacerts.TRUST_PWD, Cacerts.STD_PWD);
106 Logger.info(
107 this,
108 "keyStore '%s' imported into trustStore '%s'",
109 keystore,
110 this.store
111 );
112 }
113
114 }