1 package org.apache.maven.internal.aether;
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.RepositoryUtils;
23 import org.apache.maven.artifact.handler.manager.ArtifactHandlerManager;
24 import org.apache.maven.bridge.MavenRepositorySystem;
25 import org.apache.maven.eventspy.internal.EventSpyDispatcher;
26 import org.apache.maven.execution.MavenExecutionRequest;
27 import org.apache.maven.repository.internal.MavenRepositorySystemUtils;
28 import org.apache.maven.settings.Mirror;
29 import org.apache.maven.settings.Proxy;
30 import org.apache.maven.settings.Server;
31 import org.apache.maven.settings.building.SettingsProblem;
32 import org.apache.maven.settings.crypto.DefaultSettingsDecryptionRequest;
33 import org.apache.maven.settings.crypto.SettingsDecrypter;
34 import org.apache.maven.settings.crypto.SettingsDecryptionResult;
35 import org.codehaus.plexus.configuration.xml.XmlPlexusConfiguration;
36 import org.codehaus.plexus.logging.Logger;
37 import org.codehaus.plexus.util.xml.Xpp3Dom;
38 import org.eclipse.aether.ConfigurationProperties;
39 import org.eclipse.aether.DefaultRepositorySystemSession;
40 import org.eclipse.aether.RepositorySystem;
41 import org.eclipse.aether.repository.LocalRepository;
42 import org.eclipse.aether.repository.NoLocalRepositoryManagerException;
43 import org.eclipse.aether.repository.RepositoryPolicy;
44 import org.eclipse.aether.repository.WorkspaceReader;
45 import org.eclipse.aether.resolution.ResolutionErrorPolicy;
46 import org.eclipse.aether.spi.localrepo.LocalRepositoryManagerFactory;
47 import org.eclipse.aether.util.repository.AuthenticationBuilder;
48 import org.eclipse.aether.util.repository.DefaultAuthenticationSelector;
49 import org.eclipse.aether.util.repository.DefaultMirrorSelector;
50 import org.eclipse.aether.util.repository.DefaultProxySelector;
51 import org.eclipse.aether.util.repository.SimpleResolutionErrorPolicy;
52 import org.eclipse.sisu.Nullable;
53
54 import javax.inject.Inject;
55 import javax.inject.Named;
56 import java.io.IOException;
57 import java.io.InputStream;
58 import java.util.LinkedHashMap;
59 import java.util.Map;
60 import java.util.Properties;
61
62
63
64
65 @Named
66 public class DefaultRepositorySystemSessionFactory
67 {
68 @Inject
69 private Logger logger;
70
71 @Inject
72 private ArtifactHandlerManager artifactHandlerManager;
73
74 @Inject
75 private RepositorySystem repoSystem;
76
77 @Inject
78 @Nullable
79 @Named( "simple" )
80 private LocalRepositoryManagerFactory simpleLocalRepoMgrFactory;
81
82 @Inject
83 @Nullable
84 @Named( "ide" )
85 private WorkspaceReader workspaceRepository;
86
87 @Inject
88 private SettingsDecrypter settingsDecrypter;
89
90 @Inject
91 private EventSpyDispatcher eventSpyDispatcher;
92
93 @Inject
94 MavenRepositorySystem mavenRepositorySystem;
95
96 public DefaultRepositorySystemSession newRepositorySession( MavenExecutionRequest request )
97 {
98 DefaultRepositorySystemSession session = MavenRepositorySystemUtils.newSession();
99
100 session.setCache( request.getRepositoryCache() );
101
102 Map<Object, Object> configProps = new LinkedHashMap<>();
103 configProps.put( ConfigurationProperties.USER_AGENT, getUserAgent() );
104 configProps.put( ConfigurationProperties.INTERACTIVE, request.isInteractiveMode() );
105 configProps.put( "maven.startTime", request.getStartTime() );
106 configProps.putAll( request.getSystemProperties() );
107 configProps.putAll( request.getUserProperties() );
108
109 session.setOffline( request.isOffline() );
110 session.setChecksumPolicy( request.getGlobalChecksumPolicy() );
111 if ( request.isNoSnapshotUpdates() )
112 {
113 session.setUpdatePolicy( RepositoryPolicy.UPDATE_POLICY_NEVER );
114 }
115 else if ( request.isUpdateSnapshots() )
116 {
117 session.setUpdatePolicy( RepositoryPolicy.UPDATE_POLICY_ALWAYS );
118 }
119 else
120 {
121 session.setUpdatePolicy( null );
122 }
123
124 int errorPolicy = 0;
125 errorPolicy |= request.isCacheNotFound() ? ResolutionErrorPolicy.CACHE_NOT_FOUND
126 : ResolutionErrorPolicy.CACHE_DISABLED;
127 errorPolicy |= request.isCacheTransferError() ? ResolutionErrorPolicy.CACHE_TRANSFER_ERROR
128 : ResolutionErrorPolicy.CACHE_DISABLED;
129 session.setResolutionErrorPolicy(
130 new SimpleResolutionErrorPolicy( errorPolicy, errorPolicy | ResolutionErrorPolicy.CACHE_NOT_FOUND ) );
131
132 session.setArtifactTypeRegistry( RepositoryUtils.newArtifactTypeRegistry( artifactHandlerManager ) );
133
134 LocalRepository localRepo = new LocalRepository( request.getLocalRepository().getBasedir() );
135
136 if ( request.isUseLegacyLocalRepository() )
137 {
138 try
139 {
140 session.setLocalRepositoryManager( simpleLocalRepoMgrFactory.newInstance( session, localRepo ) );
141 logger.info( "Disabling enhanced local repository: using legacy is strongly discouraged to ensure"
142 + " build reproducibility." );
143
144 }
145 catch ( NoLocalRepositoryManagerException e )
146 {
147 logger.error( "Failed to configure legacy local repository: falling back to default" );
148 session.setLocalRepositoryManager( repoSystem.newLocalRepositoryManager( session, localRepo ) );
149 }
150 }
151 else
152 {
153 session.setLocalRepositoryManager( repoSystem.newLocalRepositoryManager( session, localRepo ) );
154 }
155
156 if ( request.getWorkspaceReader() != null )
157 {
158 session.setWorkspaceReader( request.getWorkspaceReader() );
159 }
160 else
161 {
162 session.setWorkspaceReader( workspaceRepository );
163 }
164
165 DefaultSettingsDecryptionRequest decrypt = new DefaultSettingsDecryptionRequest();
166 decrypt.setProxies( request.getProxies() );
167 decrypt.setServers( request.getServers() );
168 SettingsDecryptionResult decrypted = settingsDecrypter.decrypt( decrypt );
169
170 if ( logger.isDebugEnabled() )
171 {
172 for ( SettingsProblem problem : decrypted.getProblems() )
173 {
174 logger.debug( problem.getMessage(), problem.getException() );
175 }
176 }
177
178 DefaultMirrorSelector mirrorSelector = new DefaultMirrorSelector();
179 for ( Mirror mirror : request.getMirrors() )
180 {
181 mirrorSelector.add( mirror.getId(), mirror.getUrl(), mirror.getLayout(), false, mirror.isBlocked(),
182 mirror.getMirrorOf(), mirror.getMirrorOfLayouts() );
183 }
184 session.setMirrorSelector( mirrorSelector );
185
186 DefaultProxySelector proxySelector = new DefaultProxySelector();
187 for ( Proxy proxy : decrypted.getProxies() )
188 {
189 AuthenticationBuilder authBuilder = new AuthenticationBuilder();
190 authBuilder.addUsername( proxy.getUsername() ).addPassword( proxy.getPassword() );
191 proxySelector.add(
192 new org.eclipse.aether.repository.Proxy( proxy.getProtocol(), proxy.getHost(), proxy.getPort(),
193 authBuilder.build() ), proxy.getNonProxyHosts() );
194 }
195 session.setProxySelector( proxySelector );
196
197 DefaultAuthenticationSelector authSelector = new DefaultAuthenticationSelector();
198 for ( Server server : decrypted.getServers() )
199 {
200 AuthenticationBuilder authBuilder = new AuthenticationBuilder();
201 authBuilder.addUsername( server.getUsername() ).addPassword( server.getPassword() );
202 authBuilder.addPrivateKey( server.getPrivateKey(), server.getPassphrase() );
203 authSelector.add( server.getId(), authBuilder.build() );
204
205 if ( server.getConfiguration() != null )
206 {
207 Xpp3Dom dom = (Xpp3Dom) server.getConfiguration();
208 for ( int i = dom.getChildCount() - 1; i >= 0; i-- )
209 {
210 Xpp3Dom child = dom.getChild( i );
211 if ( "wagonProvider".equals( child.getName() ) )
212 {
213 dom.removeChild( i );
214 }
215 }
216
217 XmlPlexusConfiguration config = new XmlPlexusConfiguration( dom );
218 configProps.put( "aether.connector.wagon.config." + server.getId(), config );
219 }
220
221 configProps.put( "aether.connector.perms.fileMode." + server.getId(), server.getFilePermissions() );
222 configProps.put( "aether.connector.perms.dirMode." + server.getId(), server.getDirectoryPermissions() );
223 }
224 session.setAuthenticationSelector( authSelector );
225
226 session.setTransferListener( request.getTransferListener() );
227
228 session.setRepositoryListener( eventSpyDispatcher.chainListener( new LoggingRepositoryListener( logger ) ) );
229
230 session.setUserProperties( request.getUserProperties() );
231 session.setSystemProperties( request.getSystemProperties() );
232 session.setConfigProperties( configProps );
233
234 mavenRepositorySystem.injectMirror( request.getRemoteRepositories(), request.getMirrors() );
235 mavenRepositorySystem.injectProxy( session, request.getRemoteRepositories() );
236 mavenRepositorySystem.injectAuthentication( session, request.getRemoteRepositories() );
237
238 mavenRepositorySystem.injectMirror( request.getPluginArtifactRepositories(), request.getMirrors() );
239 mavenRepositorySystem.injectProxy( session, request.getPluginArtifactRepositories() );
240 mavenRepositorySystem.injectAuthentication( session, request.getPluginArtifactRepositories() );
241
242 return session;
243 }
244
245 private String getUserAgent()
246 {
247 return "Apache-Maven/" + getMavenVersion() + " (Java " + System.getProperty( "java.version" ) + "; "
248 + System.getProperty( "os.name" ) + " " + System.getProperty( "os.version" ) + ")";
249 }
250
251 private String getMavenVersion()
252 {
253 Properties props = new Properties();
254
255 try ( InputStream is = getClass().getResourceAsStream(
256 "/META-INF/maven/org.apache.maven/maven-core/pom.properties" ) )
257 {
258 if ( is != null )
259 {
260 props.load( is );
261 }
262 }
263 catch ( IOException e )
264 {
265 logger.debug( "Failed to read Maven version", e );
266 }
267
268 return props.getProperty( "version", "unknown-version" );
269 }
270
271 }