Skip to content

Commit 698f453

Browse files
sullistimtebeekshanman190
authored
Use Maven repository credentials in GradleProjectBuilder (#6096)
* use maven repo credentials * Builder does not accept a `null` username or password * Adopt `username` within `credentials` * Only get credentials on Gradle 6.6 or newer * Verify username and password extracted * Map over credentials in all valid cases for all Gradle versions * Remove unnecessary gradle.properties file for HTTP header authentication test case * Remove unused import and streamline assertions * Minimize changes --------- Co-authored-by: Tim te Beek <tim@moderne.io> Co-authored-by: Shannon Pamperl <shannon@moderne.io> Co-authored-by: Shannon Pamperl <shanman190@gmail.com>
1 parent 3604ec8 commit 698f453

3 files changed

Lines changed: 210 additions & 4 deletions

File tree

rewrite-gradle-tooling-model/model/src/main/java/org/openrewrite/gradle/marker/GradleProjectBuilder.java

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import org.gradle.api.artifacts.*;
2020
import org.gradle.api.artifacts.repositories.ArtifactRepository;
2121
import org.gradle.api.artifacts.repositories.MavenArtifactRepository;
22+
import org.gradle.api.artifacts.repositories.PasswordCredentials;
2223
import org.gradle.api.attributes.Attribute;
2324
import org.gradle.api.attributes.HasAttributes;
2425
import org.gradle.api.initialization.Settings;
@@ -87,15 +88,26 @@ static List<MavenRepository> mapRepositories(List<ArtifactRepository> repositori
8788
return repositories.stream()
8889
.filter(MavenArtifactRepository.class::isInstance)
8990
.map(MavenArtifactRepository.class::cast)
90-
.map(repo -> MavenRepository.builder()
91+
.map(repo -> withAuthentication(repo, MavenRepository.builder()
9192
.id(repo.getName())
9293
.uri(repo.getUrl().toString())
9394
.releases(true)
94-
.snapshots(true)
95+
.snapshots(true))
9596
.build())
9697
.collect(toList());
9798
}
9899

100+
private static MavenRepository.Builder withAuthentication(MavenArtifactRepository repo, MavenRepository.Builder builder) {
101+
try {
102+
PasswordCredentials passwordCredentials = repo.getCredentials(PasswordCredentials.class);
103+
Optional.ofNullable(passwordCredentials.getUsername()).ifPresent(builder::username);
104+
Optional.ofNullable(passwordCredentials.getPassword()).ifPresent(builder::password);
105+
} catch (IllegalArgumentException e) {
106+
// We're not using password credentials
107+
}
108+
return builder;
109+
}
110+
99111
public static List<GradlePluginDescriptor> pluginDescriptors(@Nullable PluginManager pluginManager) {
100112
if (pluginManager instanceof PluginManagerInternal) {
101113
return pluginDescriptors((PluginManagerInternal) pluginManager);

rewrite-gradle-tooling-model/plugin/src/main/java/org/openrewrite/gradle/toolingapi/ToolingApiOpenRewriteModelPlugin.java

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
*/
1616
package org.openrewrite.gradle.toolingapi;
1717

18+
import com.fasterxml.jackson.annotation.JsonProperty;
1819
import com.fasterxml.jackson.databind.ObjectMapper;
1920
import org.gradle.api.Plugin;
2021
import org.gradle.api.Project;
@@ -26,6 +27,7 @@
2627
import org.openrewrite.gradle.marker.GradleProjectBuilder;
2728
import org.openrewrite.gradle.marker.GradleSettings;
2829
import org.openrewrite.gradle.marker.GradleSettingsBuilder;
30+
import org.openrewrite.maven.tree.MavenRepository;
2931

3032
import javax.inject.Inject;
3133
import java.io.File;
@@ -44,7 +46,7 @@ public void apply(Project project) {
4446
registry.register(new OpenRewriteModelBuilder());
4547
}
4648

47-
private static final ObjectMapper mapper = new RecipeSerializer().getMapper();
49+
private static final ObjectMapper mapper = new RecipeSerializer().getMapper().copy().addMixIn(MavenRepository.class, MavenRepositoryMixin.class);
4850

4951
private static class OpenRewriteModelBuilder implements ToolingModelBuilder {
5052
@Override
@@ -71,4 +73,12 @@ public Object buildAll(String modelName, Project project) {
7173
}
7274
}
7375
}
76+
77+
interface MavenRepositoryMixin {
78+
@JsonProperty(access = JsonProperty.Access.READ_WRITE)
79+
String getUsername();
80+
81+
@JsonProperty(access = JsonProperty.Access.READ_WRITE)
82+
String getPassword();
83+
}
7484
}

rewrite-gradle/src/test/java/org/openrewrite/gradle/marker/GradleProjectTest.java

Lines changed: 185 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
import org.openrewrite.maven.tree.GroupArtifact;
3030
import org.openrewrite.maven.tree.GroupArtifactVersion;
3131
import org.openrewrite.maven.tree.ResolvedDependency;
32+
import org.openrewrite.properties.tree.Properties;
3233
import org.openrewrite.test.RecipeSpec;
3334
import org.openrewrite.test.RewriteTest;
3435
import org.openrewrite.test.SourceSpec;
@@ -43,6 +44,7 @@
4344
import static org.openrewrite.gradle.Assertions.settingsGradle;
4445
import static org.openrewrite.gradle.toolingapi.Assertions.withToolingApi;
4546
import static org.openrewrite.java.Assertions.mavenProject;
47+
import static org.openrewrite.properties.Assertions.properties;
4648

4749
class GradleProjectTest implements RewriteTest {
4850

@@ -76,6 +78,184 @@ void noopUpgrade() {
7678
);
7779
}
7880

81+
@Test
82+
void repositoryWithCredentials() {
83+
rewriteRun(
84+
spec -> spec.recipe(new UpgradeDependencyInMarker(
85+
new GroupArtifactVersion("org.openrewrite", "rewrite-java", "8.56.0"),
86+
"implementation",
87+
(original, updated) -> assertThat(updated)
88+
.isSameAs(original)
89+
.satisfies(gp -> assertThat(gp.getMavenRepositories())
90+
.singleElement()
91+
.satisfies(repo -> {
92+
assertThat(repo.getUri()).isEqualTo("https://example.com/maven2");
93+
assertThat(repo.getUsername()).isEqualTo("dummyuser");
94+
assertThat(repo.getPassword()).isEqualTo("dummypass");
95+
}))
96+
)),
97+
properties(
98+
"""
99+
mavenUsername=dummyuser
100+
mavenPassword=dummypass
101+
""",
102+
spec -> spec.path("gradle.properties")
103+
),
104+
buildGradle(
105+
"""
106+
plugins {
107+
id("java")
108+
}
109+
repositories {
110+
maven {
111+
url = "https://example.com/maven2"
112+
credentials {
113+
username = findProperty("mavenUsername")
114+
password = findProperty("mavenPassword")
115+
}
116+
}
117+
}
118+
dependencies {
119+
implementation("org.openrewrite:rewrite-java:8.56.0")
120+
}
121+
"""
122+
)
123+
);
124+
}
125+
126+
@Test
127+
void repositoryWithPreemptiveCredentials() {
128+
rewriteRun(
129+
spec -> spec.recipe(new UpgradeDependencyInMarker(
130+
new GroupArtifactVersion("org.openrewrite", "rewrite-java", "8.56.0"),
131+
"implementation",
132+
(original, updated) -> assertThat(updated)
133+
.isSameAs(original)
134+
.satisfies(gp -> assertThat(gp.getMavenRepositories())
135+
.singleElement()
136+
.satisfies(repo -> {
137+
assertThat(repo.getUri()).isEqualTo("https://example.com/maven2");
138+
assertThat(repo.getUsername()).isEqualTo("dummyuser");
139+
assertThat(repo.getPassword()).isEqualTo("dummypass");
140+
}))
141+
)),
142+
properties(
143+
"""
144+
mavenUsername=dummyuser
145+
mavenPassword=dummypass
146+
""",
147+
spec -> spec.path("gradle.properties")
148+
),
149+
buildGradle(
150+
"""
151+
plugins {
152+
id("java")
153+
}
154+
repositories {
155+
maven {
156+
url = "https://example.com/maven2"
157+
credentials {
158+
username = findProperty("mavenUsername")
159+
password = findProperty("mavenPassword")
160+
authentication {
161+
basic(BasicAuthentication)
162+
}
163+
}
164+
}
165+
}
166+
dependencies {
167+
implementation("org.openrewrite:rewrite-java:8.56.0")
168+
}
169+
"""
170+
)
171+
);
172+
}
173+
174+
@Test
175+
void repositoryWithPasswordCredentials() {
176+
rewriteRun(
177+
spec -> spec.recipe(new UpgradeDependencyInMarker(
178+
new GroupArtifactVersion("org.openrewrite", "rewrite-java", "8.56.0"),
179+
"implementation",
180+
(original, updated) -> assertThat(updated)
181+
.isSameAs(original)
182+
.satisfies(gp -> assertThat(gp.getMavenRepositories())
183+
.singleElement()
184+
.satisfies(repo -> {
185+
assertThat(repo.getUri()).isEqualTo("https://example.com/maven2");
186+
assertThat(repo.getUsername()).isEqualTo("dummyuser");
187+
assertThat(repo.getPassword()).isEqualTo("dummypass");
188+
}))
189+
)),
190+
properties(
191+
"""
192+
mySecureRepositoryUsername=dummyuser
193+
mySecureRepositoryPassword=dummypass
194+
""",
195+
spec -> spec.path("gradle.properties")
196+
),
197+
buildGradle(
198+
"""
199+
plugins {
200+
id("java")
201+
}
202+
repositories {
203+
maven {
204+
name = "mySecureRepository"
205+
url = "https://example.com/maven2"
206+
credentials(PasswordCredentials)
207+
}
208+
}
209+
dependencies {
210+
implementation("org.openrewrite:rewrite-java:8.56.0")
211+
}
212+
"""
213+
)
214+
);
215+
}
216+
217+
@Test
218+
void repositoryWithHttpHeaderCredentials() {
219+
rewriteRun(
220+
spec -> spec.recipe(new UpgradeDependencyInMarker(
221+
new GroupArtifactVersion("org.openrewrite", "rewrite-java", "8.56.0"),
222+
"implementation",
223+
(original, updated) -> assertThat(updated)
224+
.isSameAs(original)
225+
.satisfies(gp -> assertThat(gp.getMavenRepositories())
226+
.singleElement()
227+
.satisfies(repo -> {
228+
assertThat(repo.getUri()).isEqualTo("https://example.com/maven2");
229+
assertThat(repo.getUsername()).isNull();
230+
assertThat(repo.getPassword()).isNull();
231+
}))
232+
)),
233+
buildGradle(
234+
"""
235+
plugins {
236+
id("java")
237+
}
238+
repositories {
239+
maven {
240+
name = "mySecureRepository"
241+
url = "https://example.com/maven2"
242+
credentials(HttpHeaderCredentials) {
243+
name = "Private-Token"
244+
value = "TOKEN"
245+
}
246+
authentication {
247+
header(HttpHeaderAuthentication)
248+
}
249+
}
250+
}
251+
dependencies {
252+
implementation("org.openrewrite:rewrite-java:8.56.0")
253+
}
254+
"""
255+
)
256+
);
257+
}
258+
79259
@Test
80260
void multiProject() {
81261
rewriteRun(
@@ -366,7 +546,7 @@ void changeConstraint() {
366546

367547
GradleDependencyConstraint jacksonConstraint = constraints.stream()
368548
.filter(c -> "com.fasterxml.jackson.core".equals(c.getGroupId()) &&
369-
"jackson-databind".equals(c.getArtifactId()))
549+
"jackson-databind".equals(c.getArtifactId()))
370550
.findFirst()
371551
.orElse(null);
372552

@@ -429,6 +609,10 @@ public TreeVisitor<?, ExecutionContext> getVisitor() {
429609
@Override
430610
@SneakyThrows
431611
public Tree visit(Tree tree, ExecutionContext ctx) {
612+
if (tree instanceof Properties.File) {
613+
// Skip gradle.properties files
614+
return tree;
615+
}
432616
GradleProject original = tree.getMarkers().findFirst(GradleProject.class).orElseThrow(() -> fail("Missing GradleProject"));
433617
GradleProject updated = original.upgradeDirectDependencyVersion(configuration, newGav, ctx);
434618
testAssertion.accept(original, updated);

0 commit comments

Comments
 (0)