1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.apache.maven.shared.release.scm;
20
21 import javax.inject.Inject;
22 import javax.inject.Named;
23 import javax.inject.Singleton;
24
25 import java.util.concurrent.atomic.AtomicReference;
26
27 import org.apache.maven.scm.manager.NoSuchScmProviderException;
28 import org.apache.maven.scm.manager.ScmManager;
29 import org.apache.maven.scm.provider.ScmProvider;
30 import org.apache.maven.scm.provider.ScmProviderRepository;
31 import org.apache.maven.scm.provider.ScmProviderRepositoryWithHost;
32 import org.apache.maven.scm.provider.svn.repository.SvnScmProviderRepository;
33 import org.apache.maven.scm.repository.ScmRepository;
34 import org.apache.maven.scm.repository.ScmRepositoryException;
35 import org.apache.maven.settings.Server;
36 import org.apache.maven.settings.Settings;
37 import org.apache.maven.shared.release.config.ReleaseDescriptor;
38 import org.apache.maven.shared.release.util.MavenCrypto;
39 import org.apache.maven.shared.release.util.MavenCrypto.MavenCryptoException;
40 import org.codehaus.plexus.util.StringUtils;
41 import org.slf4j.Logger;
42 import org.slf4j.LoggerFactory;
43
44 import static java.util.Objects.requireNonNull;
45
46
47
48
49
50
51 @Singleton
52 @Named
53 public class DefaultScmRepositoryConfigurator implements ScmRepositoryConfigurator {
54 private final Logger logger = LoggerFactory.getLogger(getClass());
55
56 private final AtomicReference<ScmManager> scmManager;
57
58 private final MavenCrypto mavenCrypto;
59
60 @Inject
61 public DefaultScmRepositoryConfigurator(ScmManager scmManager, MavenCrypto mavenCrypto) {
62 this.scmManager = new AtomicReference<>(requireNonNull(scmManager));
63 this.mavenCrypto = requireNonNull(mavenCrypto);
64 }
65
66
67
68
69 public void setScmManager(ScmManager scmManager) {
70 this.scmManager.set(scmManager);
71 }
72
73 @Override
74 public ScmRepository getConfiguredRepository(ReleaseDescriptor releaseDescriptor, Settings settings)
75 throws ScmRepositoryException, NoSuchScmProviderException {
76 String url = releaseDescriptor.getScmSourceUrl();
77 return getConfiguredRepository(url, releaseDescriptor, settings);
78 }
79
80 @Override
81 public ScmRepository getConfiguredRepository(String url, ReleaseDescriptor releaseDescriptor, Settings settings)
82 throws ScmRepositoryException, NoSuchScmProviderException {
83 String username = releaseDescriptor.getScmUsername();
84 String password = releaseDescriptor.getScmPassword();
85 String privateKey = releaseDescriptor.getScmPrivateKey();
86 String passphrase = releaseDescriptor.getScmPrivateKeyPassPhrase();
87
88 ScmRepository repository = scmManager.get().makeScmRepository(url);
89
90 ScmProviderRepository scmRepo = repository.getProviderRepository();
91
92
93 scmRepo.setPersistCheckout(false);
94
95 if (settings != null) {
96 Server server = null;
97
98 if (releaseDescriptor.getScmId() != null) {
99 server = settings.getServer(releaseDescriptor.getScmId());
100 }
101
102 if (server == null && repository.getProviderRepository() instanceof ScmProviderRepositoryWithHost) {
103 ScmProviderRepositoryWithHost repositoryWithHost =
104 (ScmProviderRepositoryWithHost) repository.getProviderRepository();
105 String host = repositoryWithHost.getHost();
106
107 int port = repositoryWithHost.getPort();
108
109 if (port > 0) {
110 host += ":" + port;
111 }
112
113
114
115 server = settings.getServer(host);
116 }
117
118 if (server != null) {
119 if (username == null) {
120 username = server.getUsername();
121 }
122
123 if (password == null) {
124 password = decrypt(server.getPassword(), server.getId());
125 }
126
127 if (privateKey == null) {
128 privateKey = server.getPrivateKey();
129 }
130
131 if (passphrase == null) {
132 passphrase = decrypt(server.getPassphrase(), server.getId());
133 }
134 }
135 }
136
137 if (!StringUtils.isEmpty(username)) {
138 scmRepo.setUser(username);
139 }
140 if (!StringUtils.isEmpty(password)) {
141 scmRepo.setPassword(password);
142 }
143
144 if (scmRepo instanceof ScmProviderRepositoryWithHost) {
145 ScmProviderRepositoryWithHost repositoryWithHost = (ScmProviderRepositoryWithHost) scmRepo;
146 if (!StringUtils.isEmpty(privateKey)) {
147 repositoryWithHost.setPrivateKey(privateKey);
148 }
149
150 if (!StringUtils.isEmpty(passphrase)) {
151 repositoryWithHost.setPassphrase(passphrase);
152 }
153 }
154
155 if ("svn".equals(repository.getProvider())) {
156 SvnScmProviderRepository svnRepo = (SvnScmProviderRepository) repository.getProviderRepository();
157
158 String tagBase = releaseDescriptor.getScmTagBase();
159 if (!StringUtils.isEmpty(tagBase)) {
160 svnRepo.setTagBase(tagBase);
161 }
162
163 String branchBase = releaseDescriptor.getScmBranchBase();
164 if (!StringUtils.isEmpty(branchBase)) {
165 svnRepo.setBranchBase(branchBase);
166 }
167 }
168
169 return repository;
170 }
171
172 private String decrypt(String str, String server) {
173 try {
174 return mavenCrypto.decrypt(str);
175 } catch (MavenCryptoException e) {
176 String msg = "Failed to decrypt password/passphrase for server " + server + ", using auth token as is: "
177 + e.getMessage();
178 if (logger.isDebugEnabled()) {
179 logger.warn(msg, e);
180 } else {
181 logger.warn(msg);
182 }
183 return str;
184 }
185 }
186
187 @Override
188 public ScmProvider getRepositoryProvider(ScmRepository repository) throws NoSuchScmProviderException {
189 return scmManager.get().getProviderByRepository(repository);
190 }
191 }