File gradle-CVE-2019-15052.patch of Package gradle.35463
--- gradle-4.4.1/subprojects/build-cache-http/src/main/java/org/gradle/caching/http/internal/DefaultHttpBuildCacheServiceFactory.java 2024-03-26 07:40:41.413892314 +0100
+++ gradle-4.4.1/subprojects/build-cache-http/src/main/java/org/gradle/caching/http/internal/DefaultHttpBuildCacheServiceFactory.java 2024-03-26 08:16:01.318058239 +0100
@@ -64,6 +64,7 @@
if (credentialsPresent(credentials)) {
DefaultBasicAuthentication basicAuthentication = new DefaultBasicAuthentication("basic");
basicAuthentication.setCredentials(credentials);
+ basicAuthentication.addHost(url.getHost(), url.getPort());
authentications = Collections.<Authentication>singleton(basicAuthentication);
}
--- gradle-4.4.1/subprojects/core/src/main/java/org/gradle/internal/authentication/AbstractAuthentication.java 2024-03-26 07:40:40.987222689 +0100
+++ gradle-4.4.1/subprojects/core/src/main/java/org/gradle/internal/authentication/AbstractAuthentication.java 2024-03-26 08:11:51.403094079 +0100
@@ -16,9 +16,14 @@
package org.gradle.internal.authentication;
+import com.google.common.collect.Sets;
import org.gradle.api.credentials.Credentials;
import org.gradle.authentication.Authentication;
+import java.util.Collection;
+import java.util.Objects;
+import java.util.Set;
+
public abstract class AbstractAuthentication implements AuthenticationInternal {
private final String name;
private final Class<? extends Credentials> supportedCredentialType;
@@ -23,18 +28,20 @@
private final String name;
private final Class<? extends Credentials> supportedCredentialType;
private final Class<? extends Authentication> type;
+
private Credentials credentials;
+ private final Set<HostAndPort> hosts;
+
public AbstractAuthentication(String name, Class<? extends Authentication> type) {
- this.name = name;
- this.supportedCredentialType = null;
- this.type = type;
+ this(name, type, null);
}
public AbstractAuthentication(String name, Class<? extends Authentication> type, Class<? extends Credentials> supportedCredential) {
this.name = name;
this.supportedCredentialType = supportedCredential;
this.type = type;
+ this.hosts = Sets.newHashSet();
}
@Override
@@ -66,4 +73,54 @@
public String toString() {
return String.format("'%s'(%s)", getName(), getType().getSimpleName());
}
+
+
+ @Override
+ public Collection<HostAndPort> getHostsForAuthentication() {
+ return hosts;
+ }
+
+
+ @Override
+ public void addHost(String host, int port) {
+ hosts.add(new DefaultHostAndPort(host, port));
+ }
+
+ private static class DefaultHostAndPort implements HostAndPort {
+ private final String host;
+ private final int port;
+
+ DefaultHostAndPort(String host, int port) {
+ this.host = host;
+ this.port = port;
+ }
+
+ @Override
+ public String getHost() {
+ return host;
+ }
+
+ @Override
+ public int getPort() {
+ return port;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass()) {
+ return false;
+ }
+ DefaultHostAndPort that = (DefaultHostAndPort) o;
+ return getPort() == that.getPort() &&
+ Objects.equals(getHost(), that.getHost());
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(getHost(), getPort());
+ }
+ }
}
--- gradle-4.4.1/subprojects/core/src/main/java/org/gradle/internal/authentication/AuthenticationInternal.java 2024-03-26 07:40:40.987222689 +0100
+++ gradle-4.4.1/subprojects/core/src/main/java/org/gradle/internal/authentication/AuthenticationInternal.java 2024-03-26 08:11:51.403094079 +0100
@@ -20,6 +20,8 @@
import org.gradle.api.credentials.Credentials;
import org.gradle.authentication.Authentication;
+import java.util.Collection;
+
@NonExtensible
public interface AuthenticationInternal extends Authentication {
boolean supports(Credentials credentials);
@@ -31,4 +33,25 @@
Class<? extends Authentication> getType();
boolean requiresCredentials();
+
+ void addHost(String host, int port);
+
+ Collection<HostAndPort> getHostsForAuthentication();
+
+ interface HostAndPort {
+
+ /**
+ * The hostname that the credentials are required for.
+ *
+ * null means "any host"
+ */
+ String getHost();
+
+ /**
+ * The port that the credentials are required for
+ *
+ * -1 means "any port"
+ */
+ int getPort();
+ }
}
--- gradle-4.4.1/subprojects/dependency-management/src/main/java/org/gradle/api/internal/artifacts/repositories/AbstractAuthenticationSupportedRepository.java 2024-03-26 07:40:40.453885657 +0100
+++ gradle-4.4.1/subprojects/dependency-management/src/main/java/org/gradle/api/internal/artifacts/repositories/AbstractAuthenticationSupportedRepository.java 2024-03-26 09:28:23.666252731 +0100
@@ -21,10 +21,13 @@
import org.gradle.api.credentials.Credentials;
import org.gradle.authentication.Authentication;
import org.gradle.internal.artifacts.repositories.AuthenticationSupportedInternal;
+import org.gradle.internal.authentication.AuthenticationInternal;
import org.gradle.internal.reflect.Instantiator;
import javax.annotation.Nullable;
+import java.net.URI;
import java.util.Collection;
+import java.util.Collections;
public abstract class AbstractAuthenticationSupportedRepository extends AbstractArtifactRepository implements AuthenticationSupportedInternal {
private final AuthenticationSupporter delegate;
@@ -76,6 +79,21 @@
@Override
public Collection<Authentication> getConfiguredAuthentication() {
- return delegate.getConfiguredAuthentication();
+ Collection<Authentication> configuredAuthentication = delegate.getConfiguredAuthentication();
+
+ for (Authentication authentication : configuredAuthentication) {
+ AuthenticationInternal authenticationInternal = (AuthenticationInternal) authentication;
+ for (URI repositoryUrl : getRepositoryUrls()) {
+ // only care about HTTP hosts right now
+ if (repositoryUrl.getScheme().startsWith("http")) {
+ authenticationInternal.addHost(repositoryUrl.getHost(), repositoryUrl.getPort());
+ }
+ }
+ }
+ return configuredAuthentication;
+ }
+
+ protected Collection<URI> getRepositoryUrls() {
+ return Collections.emptyList();
}
}
--- gradle-4.4.1/subprojects/dependency-management/src/main/java/org/gradle/api/internal/artifacts/repositories/DefaultIvyArtifactRepository.java 2024-03-26 07:40:40.453885657 +0100
+++ gradle-4.4.1/subprojects/dependency-management/src/main/java/org/gradle/api/internal/artifacts/repositories/DefaultIvyArtifactRepository.java 2024-03-26 09:32:04.764408347 +0100
@@ -15,6 +15,7 @@
*/
package org.gradle.api.internal.artifacts.repositories;
+import com.google.common.collect.ImmutableList;
import groovy.lang.Closure;
import org.gradle.api.Action;
import org.gradle.api.ActionConfiguration;
@@ -54,6 +55,7 @@
import org.gradle.util.ConfigureUtil;
import java.net.URI;
+import java.util.Collection;
import java.util.LinkedHashSet;
import java.util.Set;
@@ -189,6 +191,31 @@
return baseUrl == null ? null : fileResolver.resolveUri(baseUrl);
}
+
+ @Override
+ protected Collection<URI> getRepositoryUrls() {
+ // Ivy can resolve files from multiple hosts, so we need to look at all
+ // of the possible URLs used by the Ivy resolver to identify all of the repositories
+ ImmutableList.Builder<URI> builder = ImmutableList.builder();
+ URI root = getUrl();
+ if (root != null) {
+ builder.add(root);
+ }
+ for (String pattern : additionalPatternsLayout.artifactPatterns) {
+ URI baseUri = new ResolvedPattern(pattern, fileResolver).baseUri;
+ if (baseUri!=null) {
+ builder.add(baseUri);
+ }
+ }
+ for (String pattern : additionalPatternsLayout.ivyPatterns) {
+ URI baseUri = new ResolvedPattern(pattern, fileResolver).baseUri;
+ if (baseUri!=null) {
+ builder.add(baseUri);
+ }
+ }
+ return builder.build();
+ }
+
@Override
public void setUrl(URI url) {
baseUrl = url;
--- gradle-4.4.1/subprojects/dependency-management/src/main/java/org/gradle/api/internal/artifacts/repositories/DefaultMavenArtifactRepository.java 2024-03-26 07:40:40.453885657 +0100
+++ gradle-4.4.1/subprojects/dependency-management/src/main/java/org/gradle/api/internal/artifacts/repositories/DefaultMavenArtifactRepository.java 2024-03-26 09:31:17.924088427 +0100
@@ -15,12 +15,14 @@
*/
package org.gradle.api.internal.artifacts.repositories;
+import com.google.common.collect.ImmutableList;
import com.google.common.collect.Lists;
import org.gradle.api.InvalidUserDataException;
import org.gradle.api.Transformer;
import org.gradle.api.artifacts.repositories.AuthenticationContainer;
import org.gradle.api.artifacts.repositories.MavenArtifactRepository;
import org.gradle.api.internal.ExperimentalFeatures;
+import org.gradle.api.internal.InstantiatorFactory;
import org.gradle.api.internal.artifacts.ImmutableModuleIdentifierFactory;
import org.gradle.api.internal.artifacts.ModuleVersionPublisher;
import org.gradle.api.internal.artifacts.ivyservice.ivyresolve.ConfiguredModuleComponentRepository;
@@ -40,6 +42,7 @@
import java.net.URI;
import java.util.ArrayList;
+import java.util.Collection;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;
@@ -152,6 +155,18 @@
return createRealResolver();
}
+ @Override
+ protected Collection<URI> getRepositoryUrls() {
+ // In a similar way to Ivy, Maven may use other hosts for additional artifacts, but not POMs
+ ImmutableList.Builder<URI> builder = ImmutableList.builder();
+ URI root = getUrl();
+ if (root != null) {
+ builder.add(root);
+ }
+ builder.addAll(getArtifactUrls());
+ return builder.build();
+ }
+
protected MavenResolver createRealResolver() {
URI rootUri = getUrl();
if (rootUri == null) {
--- gradle-4.4.1/subprojects/resources-http/src/main/java/org/gradle/internal/resource/transport/http/HttpClientConfigurer.java 2024-03-26 07:40:41.393892176 +0100
+++ gradle-4.4.1/subprojects/resources-http/src/main/java/org/gradle/internal/resource/transport/http/HttpClientConfigurer.java 2024-03-26 09:15:06.421058834 +0100
@@ -117,7 +117,7 @@
private void configureCredentials(HttpClientBuilder builder, CredentialsProvider credentialsProvider, Collection<Authentication> authentications) {
if(authentications.size() > 0) {
- useCredentials(credentialsProvider, AuthScope.ANY_HOST, AuthScope.ANY_PORT, authentications);
+ useCredentials(credentialsProvider, authentications);
// Use preemptive authorisation if no other authorisation has been established
builder.addInterceptorFirst(new PreemptiveAuth(new BasicScheme(), isPreemptiveEnabled(authentications)));
@@ -131,31 +131,49 @@
for (HttpProxySettings.HttpProxy proxy : Lists.newArrayList(httpProxy, httpsProxy)) {
if (proxy != null) {
if (proxy.credentials != null) {
- useCredentials(credentialsProvider, proxy.host, proxy.port, Collections.singleton(new AllSchemesAuthentication(proxy.credentials)));
+ AllSchemesAuthentication authentication = new AllSchemesAuthentication(proxy.credentials);
+ authentication.addHost(proxy.host, proxy.port);
+ useCredentials(credentialsProvider, Collections.singleton(authentication));
}
}
}
builder.setRoutePlanner(new SystemDefaultRoutePlanner(ProxySelector.getDefault()));
}
- private void useCredentials(CredentialsProvider credentialsProvider, String host, int port, Collection<? extends Authentication> authentications) {
- Credentials httpCredentials;
-
+ private void useCredentials(CredentialsProvider credentialsProvider, Collection<? extends Authentication> authentications) {
for (Authentication authentication : authentications) {
+ AuthenticationInternal authenticationInternal = (AuthenticationInternal) authentication;
+
String scheme = getAuthScheme(authentication);
- PasswordCredentials credentials = getPasswordCredentials(authentication);
+ org.gradle.api.credentials.Credentials credentials = authenticationInternal.getCredentials();
+
+ Collection<AuthenticationInternal.HostAndPort> hostsForAuthentication = authenticationInternal.getHostsForAuthentication();
+ assert !hostsForAuthentication.isEmpty() : "Credentials and authentication required for a HTTP repository, but no hosts were defined for the authentication?";
+
+ for (AuthenticationInternal.HostAndPort hostAndPort : hostsForAuthentication) {
+ String host = hostAndPort.getHost();
+ int port = hostAndPort.getPort();
+
+ assert host != null : "HTTP credentials and authentication require a host scope to be defined as well";
+
+ if (credentials instanceof PasswordCredentials) {
+ PasswordCredentials passwordCredentials = (PasswordCredentials) credentials;
if (authentication instanceof AllSchemesAuthentication) {
- NTLMCredentials ntlmCredentials = new NTLMCredentials(credentials);
- httpCredentials = new NTCredentials(ntlmCredentials.getUsername(), ntlmCredentials.getPassword(), ntlmCredentials.getWorkstation(), ntlmCredentials.getDomain());
+ NTLMCredentials ntlmCredentials = new NTLMCredentials(passwordCredentials);
+ Credentials httpCredentials = new NTCredentials(ntlmCredentials.getUsername(), ntlmCredentials.getPassword(), ntlmCredentials.getWorkstation(), ntlmCredentials.getDomain());
credentialsProvider.setCredentials(new AuthScope(host, port, AuthScope.ANY_REALM, AuthSchemes.NTLM), httpCredentials);
- LOGGER.debug("Using {} and {} for authenticating against '{}:{}' using {}", credentials, ntlmCredentials, host, port, AuthSchemes.NTLM);
+ LOGGER.debug("Using {} and {} for authenticating against '{}:{}' using {}", passwordCredentials, ntlmCredentials, host, port, AuthSchemes.NTLM);
}
- httpCredentials = new UsernamePasswordCredentials(credentials.getUsername(), credentials.getPassword());
+ Credentials httpCredentials = new UsernamePasswordCredentials(passwordCredentials.getUsername(), passwordCredentials.getPassword());
credentialsProvider.setCredentials(new AuthScope(host, port, AuthScope.ANY_REALM, scheme), httpCredentials);
- LOGGER.debug("Using {} for authenticating against '{}:{}' using {}", credentials, host, port, scheme);
+ LOGGER.debug("Using {} for authenticating against '{}:{}' using {}", passwordCredentials, host, port, scheme);
+ } else {
+ throw new IllegalArgumentException(String.format("Credentials must be an instance of: %s", PasswordCredentials.class.getCanonicalName()));
+ }
+ }
}
}
@@ -256,11 +274,10 @@
CredentialsProvider credentialsProvider = (CredentialsProvider) context.getAttribute(HttpClientContext.CREDS_PROVIDER);
HttpHost targetHost = (HttpHost) context.getAttribute(HttpCoreContext.HTTP_TARGET_HOST);
Credentials credentials = credentialsProvider.getCredentials(new AuthScope(targetHost.getHostName(), targetHost.getPort()));
- if (credentials == null) {
- throw new HttpException("No credentials for preemptive authentication");
- }
+ if (credentials != null) {
authState.update(authScheme, credentials);
}
}
}
+ }
}