View Javadoc
1   package org.apache.maven.shared.release.scm;
2   
3   /*
4    * Licensed to the Apache Software Foundation (ASF) under one
5    * or more contributor license agreements.  See the NOTICE file
6    * distributed with this work for additional information
7    * regarding copyright ownership.  The ASF licenses this file
8    * to you under the Apache License, Version 2.0 (the
9    * "License"); you may not use this file except in compliance
10   * with the License.  You may obtain a copy of the License at
11   *
12   *   http://www.apache.org/licenses/LICENSE-2.0
13   *
14   * Unless required by applicable law or agreed to in writing,
15   * software distributed under the License is distributed on an
16   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
17   * KIND, either express or implied.  See the License for the
18   * specific language governing permissions and limitations
19   * under the License.
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   * Tool that gets a configured SCM repository from release configuration.
40   *
41   * @author <a href="mailto:brett@apache.org">Brett Porter</a>
42   * @plexus.component role="org.apache.maven.shared.release.scm.ScmRepositoryConfigurator"
43   */
44  public class DefaultScmRepositoryConfigurator
45      extends AbstractLogEnabled
46      implements ScmRepositoryConfigurator
47  {
48      /**
49       * The SCM manager.
50       *
51       * @plexus.requirement
52       */
53      private ScmManager scmManager;
54  
55      /**
56       * When this plugin requires Maven 3.0 as minimum, this component can be removed and o.a.m.s.c.SettingsDecrypter be
57       * used instead.
58       * 
59       * @plexus.requirement role-hint="mng-4384"
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          //MRELEASE-76
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                 // TODO: this is a bit dodgy - id is not host, but since we don't have a <host> field we make an assumption
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 }