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