Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: Make proxy reading method public #19902

Merged
merged 2 commits into from
Sep 6, 2024
Merged
Show file tree
Hide file tree
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 @@ -128,16 +128,6 @@ public class FrontendTools {
private static final FrontendVersion SUPPORTED_NPM_VERSION = new FrontendVersion(
SUPPORTED_NPM_MAJOR_VERSION, SUPPORTED_NPM_MINOR_VERSION);

static final String NPMRC_NOPROXY_PROPERTY_KEY = "noproxy";
static final String NPMRC_HTTPS_PROXY_PROPERTY_KEY = "https-proxy";
static final String NPMRC_PROXY_PROPERTY_KEY = "proxy";

// Proxy config properties keys (for both system properties and environment
// variables) can be either fully upper case or fully lower case
static final String SYSTEM_NOPROXY_PROPERTY_KEY = "NOPROXY";
static final String SYSTEM_HTTPS_PROXY_PROPERTY_KEY = "HTTPS_PROXY";
static final String SYSTEM_HTTP_PROXY_PROPERTY_KEY = "HTTP_PROXY";

private static final int SUPPORTED_PNPM_MAJOR_VERSION = 7;
private static final int SUPPORTED_PNPM_MINOR_VERSION = 0;

Expand Down Expand Up @@ -712,18 +702,7 @@ protected String installNode(String nodeVersion, URI downloadRoot) {
*/
// Not private because of test
protected List<ProxyConfig.Proxy> getProxies() {
File projectNpmrc = new File(baseDir, ".npmrc");
File userNpmrc = new File(FileUtils.getUserDirectory(), ".npmrc");
List<ProxyConfig.Proxy> proxyList = new ArrayList<>();

proxyList.addAll(readProxySettingsFromSystemProperties());
proxyList.addAll(
readProxySettingsFromNpmrcFile("user .npmrc", userNpmrc));
proxyList.addAll(
readProxySettingsFromNpmrcFile("project .npmrc", projectNpmrc));
proxyList.addAll(readProxySettingsFromEnvironmentVariables());

return proxyList;
return ProxyFactory.getProxies(new File(baseDir));
}

void checkForFaultyNpmVersion(FrontendVersion npmVersion) {
Expand Down Expand Up @@ -869,112 +848,6 @@ private Logger getLogger() {
return LoggerFactory.getLogger(FrontendTools.class);
}

private List<ProxyConfig.Proxy> readProxySettingsFromNpmrcFile(
String fileDescription, File npmrc) {
if (!npmrc.exists()) {
return Collections.emptyList();
}

try (FileReader fileReader = new FileReader(npmrc)) { // NOSONAR
List<ProxyConfig.Proxy> proxyList = new ArrayList<>(2);
Properties properties = new Properties();
properties.load(fileReader);
String noproxy = properties.getProperty(NPMRC_NOPROXY_PROPERTY_KEY);
if (noproxy != null)
noproxy = noproxy.replaceAll(",", "|");
String httpsProxyUrl = properties
.getProperty(NPMRC_HTTPS_PROXY_PROPERTY_KEY);
if (httpsProxyUrl != null) {
proxyList.add(new ProxyConfig.Proxy(
"https-proxy - " + fileDescription, httpsProxyUrl,
noproxy));
}
String proxyUrl = properties.getProperty(NPMRC_PROXY_PROPERTY_KEY);
if (proxyUrl != null) {
proxyList.add(new ProxyConfig.Proxy(
"proxy - " + fileDescription, proxyUrl, noproxy));
}
return proxyList;
} catch (IOException e) {
throw new UncheckedIOException(e);
}
}

private List<ProxyConfig.Proxy> readProxySettingsFromSystemProperties() {
List<ProxyConfig.Proxy> proxyList = new ArrayList<>(2);

String noproxy = getNonNull(
System.getProperty(SYSTEM_NOPROXY_PROPERTY_KEY),
System.getProperty(SYSTEM_NOPROXY_PROPERTY_KEY.toLowerCase()));
if (noproxy != null) {
noproxy = noproxy.replaceAll(",", "|");
}

String httpsProxyUrl = getNonNull(
System.getProperty(SYSTEM_HTTPS_PROXY_PROPERTY_KEY),
System.getProperty(
SYSTEM_HTTPS_PROXY_PROPERTY_KEY.toLowerCase()));
if (httpsProxyUrl != null) {
proxyList.add(new ProxyConfig.Proxy("https-proxy - system",
httpsProxyUrl, noproxy));
}

String proxyUrl = getNonNull(
System.getProperty(SYSTEM_HTTP_PROXY_PROPERTY_KEY),
System.getProperty(
SYSTEM_HTTP_PROXY_PROPERTY_KEY.toLowerCase()));
if (proxyUrl != null) {
proxyList.add(
new ProxyConfig.Proxy("proxy - system", proxyUrl, noproxy));
}

return proxyList;
}

private List<ProxyConfig.Proxy> readProxySettingsFromEnvironmentVariables() {
List<ProxyConfig.Proxy> proxyList = new ArrayList<>(2);

String noproxy = getNonNull(System.getenv(SYSTEM_NOPROXY_PROPERTY_KEY),
System.getenv(SYSTEM_NOPROXY_PROPERTY_KEY.toLowerCase()));
if (noproxy != null) {
noproxy = noproxy.replaceAll(",", "|");
}

String httpsProxyUrl = getNonNull(
System.getenv(SYSTEM_HTTPS_PROXY_PROPERTY_KEY),
System.getenv(SYSTEM_HTTPS_PROXY_PROPERTY_KEY.toLowerCase()));
if (httpsProxyUrl != null) {
proxyList.add(new ProxyConfig.Proxy("https-proxy - env",
httpsProxyUrl, noproxy));
}

String proxyUrl = getNonNull(
System.getenv(SYSTEM_HTTP_PROXY_PROPERTY_KEY),
System.getenv(SYSTEM_HTTP_PROXY_PROPERTY_KEY.toLowerCase()));
if (proxyUrl != null) {
proxyList.add(
new ProxyConfig.Proxy("proxy - env", proxyUrl, noproxy));
}

return proxyList;
}

/**
* Get the first non null value from the given array.
*
* @param valueArray
* array of values to get non null from
* @return first non null value or null if no values found
*/
private String getNonNull(String... valueArray) {
for (String value : valueArray) {
if (value != null) {
return value;
}
}
return null;
}

private List<String> getNpmExecutable(boolean removePnpmLock) {
List<String> returnCommand = new ArrayList<>(
getNpmCliToolExecutable(BuildTool.NPM));
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,156 @@
package com.vaadin.flow.server.frontend;

import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.UncheckedIOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Properties;

import org.apache.commons.io.FileUtils;

import com.vaadin.flow.server.frontend.installer.ProxyConfig;

public class ProxyFactory {

static final String NPMRC_NOPROXY_PROPERTY_KEY = "noproxy";
static final String NPMRC_HTTPS_PROXY_PROPERTY_KEY = "https-proxy";
static final String NPMRC_PROXY_PROPERTY_KEY = "proxy";

// Proxy config properties keys (for both system properties and environment
// variables) can be either fully upper case or fully lower case
static final String SYSTEM_NOPROXY_PROPERTY_KEY = "NOPROXY";
static final String SYSTEM_HTTPS_PROXY_PROPERTY_KEY = "HTTPS_PROXY";
static final String SYSTEM_HTTP_PROXY_PROPERTY_KEY = "HTTP_PROXY";

/**
* Read list of configured proxies in order from system properties, .npmrc
* file in the project root folder, .npmrc file in user root folder and
* system environment variables.
*
* @return list of configured proxies
*/
public static List<ProxyConfig.Proxy> getProxies(File projectDirectory) {
File projectNpmrc = new File(projectDirectory, ".npmrc");
File userNpmrc = new File(FileUtils.getUserDirectory(), ".npmrc");
List<ProxyConfig.Proxy> proxyList = new ArrayList<>();

proxyList.addAll(readProxySettingsFromSystemProperties());
proxyList.addAll(
readProxySettingsFromNpmrcFile("user .npmrc", userNpmrc));
proxyList.addAll(
readProxySettingsFromNpmrcFile("project .npmrc", projectNpmrc));
proxyList.addAll(readProxySettingsFromEnvironmentVariables());

return proxyList;
}

private static List<ProxyConfig.Proxy> readProxySettingsFromNpmrcFile(
String fileDescription, File npmrc) {
if (!npmrc.exists()) {
return Collections.emptyList();
}

try (FileReader fileReader = new FileReader(npmrc)) { // NOSONAR
List<ProxyConfig.Proxy> proxyList = new ArrayList<>(2);
Properties properties = new Properties();
properties.load(fileReader);
String noproxy = properties.getProperty(NPMRC_NOPROXY_PROPERTY_KEY);
if (noproxy != null)
noproxy = noproxy.replaceAll(",", "|");
String httpsProxyUrl = properties
.getProperty(NPMRC_HTTPS_PROXY_PROPERTY_KEY);
if (httpsProxyUrl != null) {
proxyList.add(new ProxyConfig.Proxy(
"https-proxy - " + fileDescription, httpsProxyUrl,
noproxy));
}
String proxyUrl = properties.getProperty(NPMRC_PROXY_PROPERTY_KEY);
if (proxyUrl != null) {
proxyList.add(new ProxyConfig.Proxy(
"proxy - " + fileDescription, proxyUrl, noproxy));
}
return proxyList;
} catch (IOException e) {
throw new UncheckedIOException(e);
}
}

private static List<ProxyConfig.Proxy> readProxySettingsFromSystemProperties() {
List<ProxyConfig.Proxy> proxyList = new ArrayList<>(2);

String noproxy = getNonNull(
System.getProperty(SYSTEM_NOPROXY_PROPERTY_KEY),
System.getProperty(SYSTEM_NOPROXY_PROPERTY_KEY.toLowerCase()));
if (noproxy != null) {
noproxy = noproxy.replaceAll(",", "|");
}

String httpsProxyUrl = getNonNull(
System.getProperty(SYSTEM_HTTPS_PROXY_PROPERTY_KEY),
System.getProperty(
SYSTEM_HTTPS_PROXY_PROPERTY_KEY.toLowerCase()));
if (httpsProxyUrl != null) {
proxyList.add(new ProxyConfig.Proxy("https-proxy - system",
httpsProxyUrl, noproxy));
}

String proxyUrl = getNonNull(
System.getProperty(SYSTEM_HTTP_PROXY_PROPERTY_KEY),
System.getProperty(
SYSTEM_HTTP_PROXY_PROPERTY_KEY.toLowerCase()));
if (proxyUrl != null) {
proxyList.add(
new ProxyConfig.Proxy("proxy - system", proxyUrl, noproxy));
}

return proxyList;
}

private static List<ProxyConfig.Proxy> readProxySettingsFromEnvironmentVariables() {
List<ProxyConfig.Proxy> proxyList = new ArrayList<>(2);

String noproxy = getNonNull(System.getenv(SYSTEM_NOPROXY_PROPERTY_KEY),
System.getenv(SYSTEM_NOPROXY_PROPERTY_KEY.toLowerCase()));
if (noproxy != null) {
noproxy = noproxy.replaceAll(",", "|");
}

String httpsProxyUrl = getNonNull(
System.getenv(SYSTEM_HTTPS_PROXY_PROPERTY_KEY),
System.getenv(SYSTEM_HTTPS_PROXY_PROPERTY_KEY.toLowerCase()));
if (httpsProxyUrl != null) {
proxyList.add(new ProxyConfig.Proxy("https-proxy - env",
httpsProxyUrl, noproxy));
}

String proxyUrl = getNonNull(
System.getenv(SYSTEM_HTTP_PROXY_PROPERTY_KEY),
System.getenv(SYSTEM_HTTP_PROXY_PROPERTY_KEY.toLowerCase()));
if (proxyUrl != null) {
proxyList.add(
new ProxyConfig.Proxy("proxy - env", proxyUrl, noproxy));
}

return proxyList;
}

/**
* Get the first non null value from the given array.
*
* @param valueArray
* array of values to get non null from
* @return first non null value or null if no values found
*/
private static String getNonNull(String... valueArray) {
for (String value : valueArray) {
if (value != null) {
return value;
}
}
return null;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -494,11 +494,11 @@ public synchronized void getProxies_systemPropertiesAndNpmrcWithProxySetting_sho
FrontendTools tools = new FrontendTools(settings);

Properties properties = new Properties();
properties.put(FrontendTools.NPMRC_PROXY_PROPERTY_KEY,
properties.put(ProxyFactory.NPMRC_PROXY_PROPERTY_KEY,
"http://httpuser:httppassword@httphost:8080");
properties.put(FrontendTools.NPMRC_HTTPS_PROXY_PROPERTY_KEY,
properties.put(ProxyFactory.NPMRC_HTTPS_PROXY_PROPERTY_KEY,
"http://httpsuser:httpspassword@httpshost:8081");
properties.put(FrontendTools.NPMRC_NOPROXY_PROPERTY_KEY,
properties.put(ProxyFactory.NPMRC_NOPROXY_PROPERTY_KEY,
"192.168.1.1,vaadin.com,mycompany.com");
try (FileOutputStream fileOutputStream = new FileOutputStream(npmrc)) {
properties.store(fileOutputStream, null);
Expand Down Expand Up @@ -572,9 +572,9 @@ public synchronized void getProxies_npmrcWithProxySettingNoNoproxy_shouldReturnN
throws IOException {
File npmrc = new File(tmpDirWithNpmrc.newFolder("test1"), ".npmrc");
Properties properties = new Properties();
properties.put(FrontendTools.NPMRC_PROXY_PROPERTY_KEY,
properties.put(ProxyFactory.NPMRC_PROXY_PROPERTY_KEY,
"http://httpuser:httppassword@httphost:8080");
properties.put(FrontendTools.NPMRC_HTTPS_PROXY_PROPERTY_KEY,
properties.put(ProxyFactory.NPMRC_HTTPS_PROXY_PROPERTY_KEY,
"http://httpsuser:httpspassword@httpshost:8081");
try (FileOutputStream fileOutputStream = new FileOutputStream(npmrc)) {
properties.store(fileOutputStream, null);
Expand Down Expand Up @@ -612,11 +612,11 @@ public synchronized void getProxies_npmrcWithProxySetting_shouldReturnProxiesLis
throws IOException {
File npmrc = new File(tmpDirWithNpmrc.newFolder("test1"), ".npmrc");
Properties properties = new Properties();
properties.put(FrontendTools.NPMRC_PROXY_PROPERTY_KEY,
properties.put(ProxyFactory.NPMRC_PROXY_PROPERTY_KEY,
"http://httpuser:httppassword@httphost:8080");
properties.put(FrontendTools.NPMRC_HTTPS_PROXY_PROPERTY_KEY,
properties.put(ProxyFactory.NPMRC_HTTPS_PROXY_PROPERTY_KEY,
"http://httpsuser:httpspassword@httpshost:8081");
properties.put(FrontendTools.NPMRC_NOPROXY_PROPERTY_KEY,
properties.put(ProxyFactory.NPMRC_NOPROXY_PROPERTY_KEY,
"192.168.1.1,vaadin.com,mycompany.com");
try (FileOutputStream fileOutputStream = new FileOutputStream(npmrc)) {
properties.store(fileOutputStream, null);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -256,6 +256,7 @@ protected Stream<String> getExcludedPatterns() {
"com\\.vaadin\\.flow\\.server\\.frontend\\.installer\\.Platform",
"com\\.vaadin\\.flow\\.server\\.frontend\\.installer\\.ProxyConfig\\$Proxy",
"com\\.vaadin\\.flow\\.server\\.frontend\\.installer\\.ProxyConfig",
"com\\.vaadin\\.flow\\.server\\.frontend\\.ProxyFactory",

// Various test classes
".*\\.test(s)?\\..*", ".*Test.*",
Expand Down
Loading