17
17
package org .springframework .boot .cli .compiler .grape ;
18
18
19
19
import java .io .File ;
20
+ import java .lang .reflect .Field ;
21
+ import java .util .List ;
20
22
21
23
import org .apache .maven .settings .Mirror ;
22
24
import org .apache .maven .settings .Proxy ;
26
28
import org .apache .maven .settings .building .DefaultSettingsBuildingRequest ;
27
29
import org .apache .maven .settings .building .SettingsBuildingException ;
28
30
import org .apache .maven .settings .building .SettingsBuildingRequest ;
31
+ import org .apache .maven .settings .crypto .DefaultSettingsDecrypter ;
32
+ import org .apache .maven .settings .crypto .DefaultSettingsDecryptionRequest ;
33
+ import org .apache .maven .settings .crypto .SettingsDecrypter ;
34
+ import org .apache .maven .settings .crypto .SettingsDecryptionResult ;
29
35
import org .eclipse .aether .DefaultRepositorySystemSession ;
30
36
import org .eclipse .aether .RepositorySystem ;
31
37
import org .eclipse .aether .repository .Authentication ;
38
44
import org .eclipse .aether .util .repository .DefaultAuthenticationSelector ;
39
45
import org .eclipse .aether .util .repository .DefaultMirrorSelector ;
40
46
import org .eclipse .aether .util .repository .DefaultProxySelector ;
47
+ import org .sonatype .plexus .components .cipher .DefaultPlexusCipher ;
48
+ import org .sonatype .plexus .components .cipher .PlexusCipherException ;
49
+ import org .sonatype .plexus .components .sec .dispatcher .DefaultSecDispatcher ;
41
50
42
51
/**
43
52
* Auto-configuration for a RepositorySystemSession that uses Maven's settings.xml to
48
57
public class SettingsXmlRepositorySystemSessionAutoConfiguration implements
49
58
RepositorySystemSessionAutoConfiguration {
50
59
51
- private static final String HOME_DIR = System .getProperty ("user.home" );
60
+ private static final String DEFAULT_HOME_DIR = System .getProperty ("user.home" );
61
+
62
+ private final String homeDir ;
63
+
64
+ public SettingsXmlRepositorySystemSessionAutoConfiguration () {
65
+ this (DEFAULT_HOME_DIR );
66
+ }
67
+
68
+ SettingsXmlRepositorySystemSessionAutoConfiguration (String homeDir ) {
69
+ this .homeDir = homeDir ;
70
+ }
52
71
53
72
@ Override
54
73
public void apply (DefaultRepositorySystemSession session ,
55
74
RepositorySystem repositorySystem ) {
56
75
57
76
Settings settings = loadSettings ();
77
+ SettingsDecryptionResult decryptionResult = decryptSettings (settings );
78
+ if (!decryptionResult .getProblems ().isEmpty ()) {
79
+ throw new IllegalStateException ("Settings decryption failed: "
80
+ + decryptionResult .getProblems ());
81
+ }
58
82
59
83
session .setOffline (settings .isOffline ());
60
84
session .setMirrorSelector (createMirrorSelector (settings ));
61
- session .setAuthenticationSelector (createAuthenticationSelector (settings ));
62
- session .setProxySelector (createProxySelector (settings ));
85
+ session .setAuthenticationSelector (createAuthenticationSelector (decryptionResult
86
+ .getServers ()));
87
+ session .setProxySelector (createProxySelector (decryptionResult .getProxies ()));
63
88
64
89
String localRepository = settings .getLocalRepository ();
65
90
if (localRepository != null ) {
@@ -69,7 +94,7 @@ public void apply(DefaultRepositorySystemSession session,
69
94
}
70
95
71
96
private Settings loadSettings () {
72
- File settingsFile = new File (HOME_DIR , ".m2/settings.xml" );
97
+ File settingsFile = new File (this . homeDir , ".m2/settings.xml" );
73
98
SettingsBuildingRequest request = new DefaultSettingsBuildingRequest ();
74
99
request .setUserSettingsFile (settingsFile );
75
100
try {
@@ -82,6 +107,32 @@ private Settings loadSettings() {
82
107
}
83
108
}
84
109
110
+ private SettingsDecryptionResult decryptSettings (Settings settings ) {
111
+ DefaultSettingsDecryptionRequest request = new DefaultSettingsDecryptionRequest (
112
+ settings );
113
+
114
+ return createSettingsDecrypter ().decrypt (request );
115
+ }
116
+
117
+ private SettingsDecrypter createSettingsDecrypter () {
118
+ SettingsDecrypter settingsDecrypter = new DefaultSettingsDecrypter ();
119
+ setField (DefaultSettingsDecrypter .class , "securityDispatcher" , settingsDecrypter ,
120
+ new SpringBootSecDispatcher ());
121
+ return settingsDecrypter ;
122
+ }
123
+
124
+ private void setField (Class <?> clazz , String fieldName , Object target , Object value ) {
125
+ try {
126
+ Field field = clazz .getDeclaredField (fieldName );
127
+ field .setAccessible (true );
128
+ field .set (target , value );
129
+ }
130
+ catch (Exception e ) {
131
+ throw new IllegalStateException ("Failed to set field '" + fieldName
132
+ + "' on '" + target + "'" , e );
133
+ }
134
+ }
135
+
85
136
private MirrorSelector createMirrorSelector (Settings settings ) {
86
137
DefaultMirrorSelector selector = new DefaultMirrorSelector ();
87
138
for (Mirror mirror : settings .getMirrors ()) {
@@ -91,9 +142,9 @@ private MirrorSelector createMirrorSelector(Settings settings) {
91
142
return selector ;
92
143
}
93
144
94
- private AuthenticationSelector createAuthenticationSelector (Settings settings ) {
145
+ private AuthenticationSelector createAuthenticationSelector (List < Server > servers ) {
95
146
DefaultAuthenticationSelector selector = new DefaultAuthenticationSelector ();
96
- for (Server server : settings . getServers () ) {
147
+ for (Server server : servers ) {
97
148
AuthenticationBuilder auth = new AuthenticationBuilder ();
98
149
auth .addUsername (server .getUsername ()).addPassword (server .getPassword ());
99
150
auth .addPrivateKey (server .getPrivateKey (), server .getPassphrase ());
@@ -102,9 +153,9 @@ private AuthenticationSelector createAuthenticationSelector(Settings settings) {
102
153
return new ConservativeAuthenticationSelector (selector );
103
154
}
104
155
105
- private ProxySelector createProxySelector (Settings settings ) {
156
+ private ProxySelector createProxySelector (List < Proxy > proxies ) {
106
157
DefaultProxySelector selector = new DefaultProxySelector ();
107
- for (Proxy proxy : settings . getProxies () ) {
158
+ for (Proxy proxy : proxies ) {
108
159
Authentication authentication = new AuthenticationBuilder ()
109
160
.addUsername (proxy .getUsername ()).addPassword (proxy .getPassword ())
110
161
.build ();
@@ -114,4 +165,19 @@ private ProxySelector createProxySelector(Settings settings) {
114
165
}
115
166
return selector ;
116
167
}
168
+
169
+ private class SpringBootSecDispatcher extends DefaultSecDispatcher {
170
+
171
+ public SpringBootSecDispatcher () {
172
+ this ._configurationFile = new File (
173
+ SettingsXmlRepositorySystemSessionAutoConfiguration .this .homeDir ,
174
+ ".m2/settings-security.xml" ).getAbsolutePath ();
175
+ try {
176
+ this ._cipher = new DefaultPlexusCipher ();
177
+ }
178
+ catch (PlexusCipherException e ) {
179
+ throw new IllegalStateException (e );
180
+ }
181
+ }
182
+ }
117
183
}
0 commit comments