1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.apache.maven.plugins.gpg;
20
21 import java.io.File;
22 import java.io.IOException;
23 import java.util.List;
24
25 import org.apache.maven.plugin.AbstractMojo;
26 import org.apache.maven.plugin.MojoExecutionException;
27 import org.apache.maven.plugin.MojoFailureException;
28 import org.apache.maven.plugins.annotations.Component;
29 import org.apache.maven.plugins.annotations.Parameter;
30 import org.apache.maven.project.MavenProject;
31 import org.apache.maven.settings.Server;
32 import org.apache.maven.settings.Settings;
33 import org.codehaus.plexus.util.StringUtils;
34 import org.sonatype.plexus.components.sec.dispatcher.SecDispatcher;
35 import org.sonatype.plexus.components.sec.dispatcher.SecDispatcherException;
36
37
38
39
40 public abstract class AbstractGpgMojo extends AbstractMojo {
41
42
43
44
45
46
47
48 @Parameter(property = "gpg.homedir")
49 private File homedir;
50
51
52
53
54
55 @Parameter(property = "gpg.passphrase")
56 private String passphrase;
57
58
59
60
61
62 @Parameter(property = "gpg.passphraseServerId", defaultValue = "gpg.passphrase")
63 private String passphraseServerId;
64
65
66
67
68 @Parameter(property = "gpg.keyname")
69 private String keyname;
70
71
72
73
74
75
76 @Parameter(property = "gpg.useagent", defaultValue = "true")
77 private boolean useAgent;
78
79
80
81 @Parameter(defaultValue = "${settings.interactiveMode}", readonly = true)
82 private boolean interactive;
83
84
85
86
87
88
89
90 @Parameter(property = "gpg.executable")
91 private String executable;
92
93
94
95
96
97
98 @Parameter(property = "gpg.defaultKeyring", defaultValue = "true")
99 private boolean defaultKeyring;
100
101
102
103
104
105
106
107
108
109
110
111 @Parameter(property = "gpg.secretKeyring")
112 private String secretKeyring;
113
114
115
116
117
118
119
120
121 @Parameter(property = "gpg.publicKeyring")
122 private String publicKeyring;
123
124
125
126
127
128
129
130
131
132
133 @Parameter(property = "gpg.lockMode")
134 private String lockMode;
135
136
137
138
139
140
141
142
143
144
145
146
147
148 @Parameter
149 private List<String> gpgArguments;
150
151
152
153
154
155
156 @Parameter(defaultValue = "${settings}", readonly = true)
157 private Settings settings;
158
159
160
161
162
163
164 @Component(hint = "mng-4384")
165 private SecDispatcher securityDispatcher;
166
167 AbstractGpgSigner newSigner(MavenProject project) throws MojoExecutionException, MojoFailureException {
168 AbstractGpgSigner signer = new GpgSigner(executable);
169
170 signer.setLog(getLog());
171 signer.setInteractive(interactive);
172 signer.setKeyName(keyname);
173 signer.setUseAgent(useAgent);
174 signer.setHomeDirectory(homedir);
175 signer.setDefaultKeyring(defaultKeyring);
176 signer.setSecretKeyring(secretKeyring);
177 signer.setPublicKeyring(publicKeyring);
178 signer.setLockMode(lockMode);
179 signer.setArgs(gpgArguments);
180
181 loadGpgPassphrase();
182
183 signer.setPassPhrase(passphrase);
184 if (null == passphrase && !useAgent) {
185 if (!interactive) {
186 throw new MojoFailureException("Cannot obtain passphrase in batch mode");
187 }
188 try {
189 signer.setPassPhrase(signer.getPassphrase(project));
190 } catch (IOException e) {
191 throw new MojoExecutionException("Exception reading passphrase", e);
192 }
193 }
194
195 return signer;
196 }
197
198
199
200
201
202
203 private void loadGpgPassphrase() throws MojoFailureException {
204 if (StringUtils.isEmpty(this.passphrase)) {
205 Server server = this.settings.getServer(passphraseServerId);
206
207 if (server != null) {
208 if (server.getPassphrase() != null) {
209 try {
210 this.passphrase = securityDispatcher.decrypt(server.getPassphrase());
211 } catch (SecDispatcherException e) {
212 throw new MojoFailureException("Unable to decrypt gpg passphrase", e);
213 }
214 }
215 }
216 }
217 }
218 }