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