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.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   * Tool that gets a configured SCM repository from release configuration.
42   *
43   * @author <a href="mailto:brett@apache.org">Brett Porter</a>
44   */
45  @Component( role = ScmRepositoryConfigurator.class, instantiationStrategy = "singleton" )
46  public class DefaultScmRepositoryConfigurator
47      extends AbstractLogEnabled
48      implements ScmRepositoryConfigurator
49  {
50      /**
51       * The SCM manager.
52       */
53      @Requirement
54      private ScmManager scmManager;
55  
56      /**
57       * When this plugin requires Maven 3.0 as minimum, this component can be removed and o.a.m.s.c.SettingsDecrypter be
58       * used instead.
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          //MRELEASE-76
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                 // TODO: this is a bit dodgy - id is not host, but since we don't have a <host> field we make an assumption
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 }