Skip to content
Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,6 @@
import java.net.MalformedURLException;
import java.net.URL;
import java.util.List;
import java.util.Optional;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

Expand All @@ -40,38 +39,41 @@
import jenkins.model.Jenkins;

public class JenkinsProxyHelper {
public static ProxyInfo getProxyInfoFromJenkins(final String url) {
final ProxyConfiguration proxyConfig = Optional.ofNullable(Jenkins.getInstanceOrNull())
.map(jenkins -> jenkins.proxy)
.orElse(null);
if (proxyConfig == null) {
return ProxyInfo.NO_PROXY_INFO;
}

String username = null;
String ntlmDomain = null;
if (StringUtils.isNotBlank(proxyConfig.getUserName())) {
final String[] possiblyDomainSlashUsername = proxyConfig.getUserName().split(Pattern.quote("\\"));
if (possiblyDomainSlashUsername.length == 1 || possiblyDomainSlashUsername[0].length() == 0) {
ntlmDomain = null;
username = proxyConfig.getUserName();
} else {
ntlmDomain = possiblyDomainSlashUsername[0];
username = possiblyDomainSlashUsername[1];
}
}
private String proxyHost;
private int proxyPort;
private String proxyUsername;
private String proxyPassword;
private List<Pattern> ignoredProxyHosts;
private String ntlmDomain;
private String ntlmWorkstation;
private Jenkins jenkins;
private ProxyInfo proxyInfo = ProxyInfo.NO_PROXY_INFO;

public JenkinsProxyHelper(Jenkins jenkins) {
this.jenkins = jenkins;
this.ntlmWorkstation = StringUtils.EMPTY;
}

return getProxyInfo(url, proxyConfig.name, proxyConfig.port, username, proxyConfig.getPassword(), proxyConfig.getNoProxyHostPatterns(), ntlmDomain, StringUtils.EMPTY);
public JenkinsProxyHelper(String proxyHost, int proxyPort, String proxyUsername, String proxyPassword, List<Pattern> ignoredProxyHosts, String ntlmDomain,
String ntlmWorkstation) {
this.proxyHost = proxyHost;
this.proxyPort = proxyPort;
this.proxyUsername = proxyUsername;
this.proxyPassword = proxyPassword;
this.ignoredProxyHosts = ignoredProxyHosts;
this.ntlmDomain = ntlmDomain;
this.ntlmWorkstation = ntlmWorkstation;
}

public static ProxyInfo getProxyInfo(final String url, final String proxyHost, final int proxyPort, final String proxyUsername, final String proxyPassword, final List<Pattern> ignoredProxyHosts, final String ntlmDomain,
final String ntlmWorkstation) {
ProxyInfo proxyInfo = ProxyInfo.NO_PROXY_INFO;
public ProxyInfo getProxyInfo(String url) {
if (jenkins != null) {
parseJenkinsForProxyConfig();
}

if (shouldUseProxy(url, ignoredProxyHosts)) {
final ProxyInfoBuilder proxyInfoBuilder = ProxyInfo.newBuilder();
ProxyInfoBuilder proxyInfoBuilder = ProxyInfo.newBuilder();

final CredentialsBuilder credentialsBuilder = Credentials.newBuilder();
CredentialsBuilder credentialsBuilder = Credentials.newBuilder();
credentialsBuilder.setUsernameAndPassword(proxyUsername, proxyPassword);

proxyInfoBuilder.setHost(proxyHost);
Expand All @@ -81,28 +83,51 @@ public static ProxyInfo getProxyInfo(final String url, final String proxyHost, f
proxyInfoBuilder.setNtlmWorkstation(StringUtils.trimToNull(ntlmWorkstation));

proxyInfo = proxyInfoBuilder.build();

}

return proxyInfo;
}

private static boolean shouldUseProxy(final String url, final List<Pattern> noProxyHosts) {
private void parseJenkinsForProxyConfig() {
ProxyConfiguration proxyConfiguration = jenkins.proxy;
String username = null;
String ntlmDomain = null;

if (StringUtils.isNotBlank(proxyConfiguration.getUserName())) {
String[] possiblyDomainSlashUsername = proxyConfiguration.getUserName().split(Pattern.quote("\\"));
if (possiblyDomainSlashUsername.length == 1 || possiblyDomainSlashUsername[0].length() == 0) {
ntlmDomain = null;
username = proxyConfiguration.getUserName();
} else {
ntlmDomain = possiblyDomainSlashUsername[0];
username = possiblyDomainSlashUsername[1];
}
}

this.proxyHost = proxyConfiguration.name;
this.proxyPort = proxyConfiguration.port;
this.proxyUsername = username;
this.proxyPassword = proxyConfiguration.getPassword();
this.ignoredProxyHosts = proxyConfiguration.getNoProxyHostPatterns();
this.ntlmDomain = ntlmDomain;
}

private boolean shouldUseProxy(String url, List<Pattern> noProxyHosts) {
try {
final URL actualURL = new URL(url);
URL actualURL = new URL(url);
return !shouldIgnoreHost(actualURL.getHost(), noProxyHosts);
} catch (final MalformedURLException e) {
} catch (MalformedURLException e) {
return false;
}
}

private static boolean shouldIgnoreHost(final String hostToMatch, final List<Pattern> ignoredProxyHostPatterns) {
private boolean shouldIgnoreHost(String hostToMatch, List<Pattern> ignoredProxyHostPatterns) {
if (StringUtils.isBlank(hostToMatch) || ignoredProxyHostPatterns == null || ignoredProxyHostPatterns.isEmpty()) {
return false;
}

for (final Pattern ignoredProxyHostPattern : ignoredProxyHostPatterns) {
final Matcher m = ignoredProxyHostPattern.matcher(hostToMatch);
for (Pattern ignoredProxyHostPattern : ignoredProxyHostPatterns) {
Matcher m = ignoredProxyHostPattern.matcher(hostToMatch);
if (m.matches()) {
return true;
}
Expand Down