Skip to content

Remove log4j, to fix current and future CVEs. #11730

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

Merged
merged 3 commits into from
Dec 20, 2021
Merged
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
2 changes: 0 additions & 2 deletions app/.classpath
Original file line number Diff line number Diff line change
@@ -38,8 +38,6 @@
<classpathentry kind="lib" path="lib/jmdns-3.5.5.jar"/>
<classpathentry kind="lib" path="lib/slf4j-api-1.7.22.jar"/>
<classpathentry kind="lib" path="lib/slf4j-simple-1.7.22.jar"/>
<classpathentry kind="lib" path="lib/log4j-api-2.16.0.jar"/>
<classpathentry kind="lib" path="lib/log4j-core-2.16.0.jar"/>
<classpathentry kind="lib" path="lib/jsch-0.1.50.jar"/>
<classpathentry kind="lib" path="lib/rsyntaxtextarea-3.0.3-SNAPSHOT.jar"/>
<classpathentry kind="lib" path="lib/xml-apis-1.3.04.jar"/>
4 changes: 0 additions & 4 deletions app/build.xml
Original file line number Diff line number Diff line change
@@ -80,10 +80,6 @@
includeAntRuntime="false"
debug="true"
classpathref="class.path" />
<!-- If you want to add files in the jars -->
<copy todir="bin" overwrite="true" verbose="true">
<fileset dir="src" includes="log4j2.xml" />
</copy>
</target>

<target name="test" depends="compile" description="Runs the test">
Binary file removed app/lib/log4j-api-2.16.0.jar
Binary file not shown.
Binary file removed app/lib/log4j-core-2.16.0.jar
Binary file not shown.
11 changes: 6 additions & 5 deletions app/src/cc/arduino/contributions/ContributionsSelfCheck.java
Original file line number Diff line number Diff line change
@@ -35,7 +35,6 @@
import cc.arduino.contributions.packages.ContributionInstaller;
import cc.arduino.contributions.packages.filters.UpdatablePlatformPredicate;
import cc.arduino.view.NotificationPopup;
import org.apache.logging.log4j.LogManager;
import processing.app.*;

import javax.swing.*;
@@ -160,12 +159,14 @@ public void windowGainedFocus(WindowEvent evt) {

private void goToManager(String link) {
try {
((UpdatableBoardsLibsFakeURLsHandler) hyperlinkListener).openBoardLibManager(new URL(link));
}
catch (Exception e){
LogManager.getLogger(ContributionsSelfCheck.class).warn("Exception while attempting to go to board manager", e);
((UpdatableBoardsLibsFakeURLsHandler) hyperlinkListener)
.openBoardLibManager(new URL(link));
} catch (Exception e) {
System.err.println("Error while attempting to open board manager: "
+ e.getMessage());
}
}

// callback for boards button
public void onOptionalButton1Callback() {
goToManager(boardsManagerURL);
29 changes: 0 additions & 29 deletions app/src/log4j2.xml

This file was deleted.

6 changes: 0 additions & 6 deletions app/src/processing/app/Base.java
Original file line number Diff line number Diff line change
@@ -220,12 +220,6 @@ public Base(String[] args) throws Exception {
parser.parseArgumentsPhase1();
commandLine = !parser.isGuiMode();

// This configure the logs root folder
if (parser.isGuiMode()) {
System.out.println("Set log4j store directory " + BaseNoGui.getSettingsFolder().getAbsolutePath());
}
System.setProperty("log4j.dir", BaseNoGui.getSettingsFolder().getAbsolutePath());

BaseNoGui.checkInstallationFolder();

// If no path is set, get the default sketchbook folder for this platform
2 changes: 0 additions & 2 deletions arduino-core/.classpath
Original file line number Diff line number Diff line change
@@ -8,8 +8,6 @@
<classpathentry kind="lib" path="lib/jmdns-3.5.5.jar"/>
<classpathentry kind="lib" path="lib/slf4j-api-1.7.22.jar"/>
<classpathentry kind="lib" path="lib/slf4j-simple-1.7.22.jar"/>
<classpathentry kind="lib" path="lib/log4j-api-2.16.0.jar"/>
<classpathentry kind="lib" path="lib/log4j-core-2.16.0.jar"/>
<classpathentry kind="lib" path="lib/jsch-0.1.50.jar"/>
<classpathentry kind="lib" path="lib/commons-exec-1.1.jar"/>
<classpathentry kind="lib" path="../app/lib/commons-httpclient-3.1.jar"/>
Binary file removed arduino-core/lib/log4j-api-2.16.0.jar
Binary file not shown.
Binary file removed arduino-core/lib/log4j-core-2.16.0.jar
Binary file not shown.
Original file line number Diff line number Diff line change
@@ -34,8 +34,6 @@
import cc.arduino.utils.Progress;
import cc.arduino.utils.network.FileDownloader;
import org.apache.commons.io.FilenameUtils;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import processing.app.BaseNoGui;
import processing.app.PreferencesData;

@@ -48,8 +46,6 @@
import static processing.app.I18n.tr;

public class DownloadableContributionsDownloader {
private static Logger log = LogManager.getLogger(DownloadableContributionsDownloader.class);

private final File stagingFolder;

public DownloadableContributionsDownloader(File _stagingFolder) {
@@ -151,7 +147,6 @@ public void download(URL url, File tmpFile, Progress progress, String statusText
}

public void downloadIndexAndSignature(MultiStepProgress progress, URL packageIndexUrl, ProgressListener progressListener, SignatureVerifier signatureVerifier) throws Exception {

// Extract the file name from the url
final String indexFileName = FilenameUtils.getName(packageIndexUrl.getPath());
final File packageIndex = BaseNoGui.indexer.getIndexFile(indexFileName);
@@ -169,16 +164,13 @@ public void downloadIndexAndSignature(MultiStepProgress progress, URL packageInd
if (checkSignature(progress, signatureUrl, progressListener, signatureVerifier, statusText, packageIndexTemp)) {
Files.move(packageIndexTemp.toPath(), packageIndex.toPath(), StandardCopyOption.REPLACE_EXISTING);
} else {
log.info("The cached files have been removed. {} {}", packageIndexUrl, signatureUrl);
FileDownloader.invalidateFiles(packageIndexUrl, signatureUrl);
}
} else {
// Move the package index to the destination when the signature is not necessary
Files.move(packageIndexTemp.toPath(), packageIndex.toPath(), StandardCopyOption.REPLACE_EXISTING);
log.info("The domain is not selected to verify the signature. will be copied into this path {}, packageIndex url: {}", packageIndex, packageIndexUrl);
}
} catch (Exception e) {
log.error("Cannot download the package index from {} the package will be discard", packageIndexUrl, e);
throw e;
} finally {
// Delete useless temp file
@@ -196,49 +188,39 @@ public boolean verifyDomain(URL url) {
if (domain.contains(url.getHost())) {
return true;
} else {
log.info("The domain is not selected to verify the signature. domain list: {}, url: {}", domain, url);
return false;
}
}

public boolean checkSignature(MultiStepProgress progress, URL signatureUrl, ProgressListener progressListener, SignatureVerifier signatureVerifier, String statusText, File fileToVerify) throws Exception {


// Signature file name
final String signatureFileName = FilenameUtils.getName(signatureUrl.getPath());
final File packageIndexSignature = BaseNoGui.indexer.getIndexFile(signatureFileName);
final File packageIndexSignatureTemp = File.createTempFile(signatureFileName, ".tmp");


try {
// Download signature
download(signatureUrl, packageIndexSignatureTemp, progress, statusText, progressListener, true);

if (PreferencesData.areInsecurePackagesAllowed()) {
Files.move(packageIndexSignatureTemp.toPath(), packageIndexSignature.toPath(), StandardCopyOption.REPLACE_EXISTING);
log.info("Allowing insecure packages because allow_insecure_packages is set to true in preferences.txt" +
" but the signature was download");
return true;
}

// Verify the signature before move the files
final boolean signatureVerified = signatureVerifier.isSigned(fileToVerify, packageIndexSignatureTemp);
if (signatureVerified) {
log.info("Signature verified. url={}, signature url={}, file to verify={}, signature file={}", signatureUrl, signatureUrl, fileToVerify, packageIndexSignatureTemp);
// Move if the signature is ok
Files.move(packageIndexSignatureTemp.toPath(), packageIndexSignature.toPath(), StandardCopyOption.REPLACE_EXISTING);
} else {
log.error("{} file signature verification failed. File ignored.", signatureUrl);
System.err.println(format(tr("{0} file signature verification failed. File ignored."), signatureUrl.toString()));
}
return signatureVerified;
} catch (Exception e) {
log.error("Cannot download the signature from {} the package will be discard", signatureUrl, e);
throw e;
} finally {
Files.deleteIfExists(packageIndexSignatureTemp.toPath());
}

}

}
Original file line number Diff line number Diff line change
@@ -38,8 +38,6 @@
import cc.arduino.utils.MultiStepProgress;
import cc.arduino.utils.network.FileDownloader;
import org.apache.commons.io.FilenameUtils;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import processing.app.BaseNoGui;
import processing.app.I18n;
import processing.app.Platform;
@@ -57,8 +55,6 @@
import static processing.app.I18n.tr;

public class LibraryInstaller {
private static Logger log = LogManager.getLogger(LibraryInstaller.class);

private final Platform platform;
private final GPGDetachedSignatureVerifier signatureVerifier;

@@ -97,10 +93,7 @@ public synchronized void updateIndex(ProgressListener progressListener) throws E
}
} else {
FileDownloader.invalidateFiles(libraryGzURL, libraryURL, signatureUrl);
log.error("Fail to verify the signature of {} the cached files have been removed", libraryURL);
}
} else {
log.info("The domain is not selected to verify the signature. library index: {}", signatureUrl);
}

// Step 2: Parse index
Original file line number Diff line number Diff line change
@@ -41,8 +41,6 @@
import org.apache.commons.exec.DefaultExecutor;
import org.apache.commons.exec.Executor;
import org.apache.commons.exec.PumpStreamHandler;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import processing.app.BaseNoGui;
import processing.app.I18n;
import processing.app.Platform;
@@ -64,8 +62,6 @@
import static processing.app.I18n.tr;

public class ContributionInstaller {
private static Logger log = LogManager.getLogger(ContributionInstaller.class);

private final Platform platform;
private final SignatureVerifier signatureVerifier;

@@ -271,8 +267,6 @@ public synchronized List<String> remove(ContributedPlatform contributedPlatform)
Files.delete(destFolder.getParentFile().toPath());
} catch (Exception e) {
// ignore
log.info("The directory is not empty there is another version installed. directory {}",
destFolder.getParentFile().toPath(), e);
}
}

@@ -298,15 +292,12 @@ public synchronized void updateIndex(ProgressListener progressListener) {
// Extract the file name from the URL
final URL packageIndexURL = new URL(packageIndexURLString);

log.info("Start download and signature check of={}", packageIndexURLs);
downloader.downloadIndexAndSignature(progress, packageIndexURL, progressListener, signatureVerifier);
} catch (Exception e) {
log.error(e.getMessage(), e);
System.err.println(e.getMessage());
}
}

progress.stepDone();
log.info("Downloaded package index URL={}", packageIndexURLs);
}
}
27 changes: 5 additions & 22 deletions arduino-core/src/cc/arduino/utils/network/FileDownloader.java
Original file line number Diff line number Diff line change
@@ -30,8 +30,6 @@
package cc.arduino.utils.network;

import org.apache.commons.compress.utils.IOUtils;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import processing.app.helpers.FileUtils;

import javax.script.ScriptException;
@@ -50,8 +48,6 @@
import java.util.Optional;

public class FileDownloader extends Observable {
private static Logger log = LogManager.getLogger(FileDownloader.class);

public enum Status {
CONNECTING, //
CONNECTION_TIMEOUT_ERROR, //
@@ -146,17 +142,16 @@ public static void invalidateFiles(URL... filesUrl) {
try {
FileDownloaderCache.getFileCached(url).ifPresent(fileCached -> {
try {
log.info("Invalidate this file {} that comes from {}", fileCached.getLocalPath(), fileCached.getRemoteURL());
fileCached.invalidateCache();
} catch (Exception e) {
log.warn("Fail to invalidate cache", e);
System.err.println("Error invalidating cached file " + fileCached.getLocalPath() + " that comes from "
+ fileCached.getRemoteURL() + ": " + e.getMessage());
}
});
} catch (URISyntaxException | NoSuchMethodException | ScriptException | IOException e) {
log.warn("Fail to get the file cached during the file invalidation", e);
System.err.println("Fail to get the file cached during the file invalidation" + e.getMessage());
}
});

}

private void downloadFile(boolean noResume) throws InterruptedException {
@@ -171,7 +166,6 @@ private void downloadFile(boolean noResume) throws InterruptedException {
final Optional<File> fileFromCache = getFileCached(fileCached);
if (fileCached.isNotChange() && fileFromCache.isPresent()) {
// Copy the cached file in the destination file
log.info("The file will be taken from the cache {}", fileFromCache);
FileUtils.copyFile(fileFromCache.get(), outputFile);
} else {
openConnectionAndFillTheFile(noResume);
@@ -191,34 +185,23 @@ private void downloadFile(boolean noResume) throws InterruptedException {
} catch (SocketTimeoutException e) {
setStatus(Status.CONNECTION_TIMEOUT_ERROR);
setError(e);
log.error("The request went in socket timeout", e);

} catch (Exception e) {
setStatus(Status.ERROR);
setError(e);
log.error("The request stop", e);
}

}

private Optional<File> getFileCached(FileDownloaderCache.FileCached fileCached) {

try {
final Optional<File> fileFromCache =
fileCached.getFileFromCache();
final Optional<File> fileFromCache = fileCached.getFileFromCache();
if (fileFromCache.isPresent()) {
log.info("No need to download using cached file: {}", fileCached);
return fileFromCache;
} else {
log.info(
"The file in the cache is not in the path or the md5 validation failed: path={}, file exist={}, md5 validation={}",
fileCached.getLocalPath(), fileCached.exists(), fileCached.md5Check());
}
} catch (Exception e) {
log.warn(
"Cannot get the file from the cache, will be downloaded a new one ", e);
// Cannot get the file from the cache, download a new one
}
log.info("The file is change {}", fileCached);
return Optional.empty();
}

53 changes: 12 additions & 41 deletions arduino-core/src/cc/arduino/utils/network/FileDownloaderCache.java
Original file line number Diff line number Diff line change
@@ -38,8 +38,6 @@
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.databind.node.ObjectNode;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import processing.app.BaseNoGui;
import processing.app.PreferencesData;
import processing.app.helpers.FileUtils;
@@ -64,18 +62,13 @@

public class FileDownloaderCache {
private final static String CACHE_ENABLE_PREFERENCE_KEY = "cache.enable";
private final static Logger log = LogManager
.getLogger(FileDownloaderCache.class);
private final static Map<String, FileCached> cachedFiles = Collections
.synchronizedMap(new HashMap<>());
private final static String cacheFolder;
private static boolean enableCache;

static {
enableCache = Boolean.valueOf(PreferencesData.get(CACHE_ENABLE_PREFERENCE_KEY, "true"));
if (!enableCache) {
log.info("The cache is disable cache.enable=false");
}
PreferencesData.set(CACHE_ENABLE_PREFERENCE_KEY, Boolean.toString(enableCache));

final File settingsFolder;
@@ -86,10 +79,8 @@ public class FileDownloaderCache {
} else {
enableCache = false;
cacheFolder = null;
log.error("The cache will disable because the setting folder is null, cannot generate the cache path");
}
final Path pathCacheInfo = getCachedInfoPath();
log.info("Cache folder {}", cacheFolder);
try {
if (Files.exists(pathCacheInfo)) {
ObjectMapper mapper = new ObjectMapper();
@@ -109,31 +100,26 @@ public class FileDownloaderCache {
.collect(Collectors.toMap(FileCached::getRemoteURL, Function.identity()))
)
);
log.info("Number of file already in the cache {}", cachedFiles.size());

}
} catch (Exception e) {
log.error("Cannot initialized the cache", e);
System.err.println("Cannot initialized the cache: " + e.getMessage());
}
}

public static Optional<FileCached> getFileCached(final URL remoteURL)
throws URISyntaxException, NoSuchMethodException, ScriptException,
IOException {
throws URISyntaxException, NoSuchMethodException, ScriptException, IOException {
return getFileCached(remoteURL, true);
}

public static Optional<FileCached> getFileCached(final URL remoteURL, boolean enableCache)
throws URISyntaxException, NoSuchMethodException, ScriptException,
IOException {
throws URISyntaxException, NoSuchMethodException, ScriptException, IOException {
// Return always and empty file if the cache is not enable
if (!(enableCache && FileDownloaderCache.enableCache)) {
log.info("The cache is not enable.");
return Optional.empty();
}
final String[] splitPath = remoteURL.getPath().split("/");
if (splitPath.length == 0) {
log.warn("The remote path as no file name {}", remoteURL);
return Optional.empty();
}
// Create the path where the cached file should exist
@@ -146,19 +132,14 @@ public static Optional<FileCached> getFileCached(final URL remoteURL, boolean en
.orElseGet(() -> new FileCached(remoteURL.toString(), cacheFilePath.toString()));

// If the file is change of the cache is disable run the HEAD request to check if the file is changed
log.info("Get file cached is expire {}, exist {}, info {} ", fileCached.isExpire(), fileCached.exists(), fileCached);
if (fileCached.isExpire() || !fileCached.exists()) {
// Update remote etag and cache control header
final Optional<FileCached> fileCachedInfoUpdated =
FileDownloaderCache.updateCacheInfo(remoteURL, (remoteETagClean, cacheControl) -> {
// Check cache control data
if (cacheControl.isNoCache() || cacheControl.isMustRevalidate() || cacheControl.isNoStore()) {
log.warn("The file {} must not be cache due to cache control header {}",
remoteURL, cacheControl);
return Optional.empty();
}
log.info("Update cached info of {}, createdAt {}, previous eTag {}, last eTag {}, cache control header {} ",
remoteURL, fileCached.createdAt, fileCached.eTag, remoteETagClean, cacheControl);
final FileCached fileCachedUpdateETag = new FileCached(
remoteURL.toString(),
cacheFilePath.toString(),
@@ -180,20 +161,18 @@ private static Optional<FileCached> updateCacheInfo(URL remoteURL, BiFunction<St
throws URISyntaxException, NoSuchMethodException, ScriptException,
IOException {
// Update the headers of the cached file
final HttpURLConnection headRequest = new HttpConnectionManager(
remoteURL).makeConnection((connection) -> {
final HttpURLConnection headRequest = new HttpConnectionManager(remoteURL).makeConnection((connection) -> {
try {
connection.setRequestMethod("HEAD");
} catch (ProtocolException e) {
log.error("Invalid protocol", e);
System.err.println(e.getMessage());
}
});
final int responseCode = headRequest.getResponseCode();
headRequest.disconnect();
// Something bad is happening return a conservative true to try to download the file
if (responseCode < 200 || responseCode >= 300) {
log.warn("The head request return a bad response code " + responseCode);
// if something bad happend
// if something bad happened
return Optional.empty();
}
// Get all the useful headers
@@ -204,7 +183,7 @@ private static Optional<FileCached> updateCacheInfo(URL remoteURL, BiFunction<St
final CacheControl cacheControl = CacheControl.valueOf(cacheControlHeader);
return getNewFile.apply(remoteETagClean, cacheControl);
}
log.warn("The head request do not return the ETag {} or the Cache-Control {}", remoteETag, cacheControlHeader);
// the head request do not return the ETag or the Cache-Control
return Optional.empty();
}

@@ -223,7 +202,6 @@ private synchronized static void updateCacheFilesInfo() throws IOException {
if (Files.notExists(cachedFileInfo)) {
Files.createDirectories(cachedFileInfo.getParent());
}
log.info("Update cache file info in {}, number of cached files is {}", cachedFileInfo.toFile(), cachedFiles.size());
// Write to cache.json
mapper.writeValue(cachedFileInfo.toFile(), objectNode);
}
@@ -287,19 +265,16 @@ public boolean isNotChange() {
@JsonIgnore
public boolean isChange() {
// Check if the file is expire
boolean isChange = false;
boolean isChanged = false;
if (isExpire()) {
log.debug("The file \"{}\" is expire. Expire time: {}", localPath,
this.getExpiresTime().format(DateTimeFormatter.ISO_DATE_TIME));
isChange = true;
isChanged = true;
}

if (lastETag != null && !lastETag.equals(eTag)) {
// If are different means that the file is change
log.debug("The file \"{}\" is changed last ETag != now Etag ({}!={})", localPath, lastETag, eTag);
isChange = true;
// Different ETag means that the file is changed
isChanged = true;
}
return isChange;
return isChanged;
}

@JsonIgnore
@@ -327,7 +302,6 @@ public synchronized void updateCacheFile(File fileToCache) throws Exception {
final String md5 = this.calculateMD5();
final String eTag;
if (lastETag == null) {
log.warn("The eTag was not calculate this time, is not the right behaviour fileCached={}, md5={}", this, md5);
eTag = this.eTag;
} else {
eTag = this.lastETag;
@@ -340,10 +314,8 @@ public synchronized void updateCacheFile(File fileToCache) throws Exception {
md5,
this.cacheControl
);
log.info("Update cache file: {}", newFileCached);
cachedFiles.put(remoteURL, newFileCached);
updateCacheFilesInfo();

}

public synchronized void invalidateCache() throws IOException {
@@ -363,7 +335,6 @@ public boolean md5Check() {
try {
return !Objects.isNull(getMD5()) && Objects.equals(calculateMD5(), getMD5());
} catch (Exception e) {
log.error("Fail to calculate the MD5. file={}", this, e);
return false;
}
}
Original file line number Diff line number Diff line change
@@ -31,9 +31,6 @@

import cc.arduino.net.CustomProxySelector;
import org.apache.commons.codec.binary.Base64;
import org.apache.commons.lang3.StringUtils;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import processing.app.BaseNoGui;
import processing.app.PreferencesData;

@@ -47,7 +44,6 @@
import java.util.function.Consumer;

public class HttpConnectionManager {
private static Logger log = LogManager.getLogger(HttpConnectionManager.class);
private static final String userAgent;
private static final int connectTimeout;
private static final int maxRedirectNumber;
@@ -69,23 +65,17 @@ public class HttpConnectionManager {
userAgent = PreferencesData.get("http.user_agent", defaultUserAgent);
int connectTimeoutFromConfig = 5000;
try {
connectTimeoutFromConfig =
Integer.parseInt(
PreferencesData.get("http.connection_timeout_ms", "5000"));
connectTimeoutFromConfig = PreferencesData.getInteger("http.connection_timeout_ms", 5000);
} catch (NumberFormatException e) {
log.warn(
"Cannot parse the http.connection_timeout configuration switch to default {} milliseconds", connectTimeoutFromConfig, e.getCause());
System.err.println("Error parsing http.connection_timeout_ms config: " + e.getMessage());
}
connectTimeout = connectTimeoutFromConfig;
// Set by default 20 max redirect to follow
int maxRedirectNumberConfig = 20;
try {
maxRedirectNumberConfig =
Integer.parseInt(
PreferencesData.get("http.max_redirect_number", "20"));
maxRedirectNumberConfig = PreferencesData.getInteger("http.max_redirect_number", 20);
} catch (NumberFormatException e) {
log.warn(
"Cannot parse the http.max_redirect_number configuration switch to default {}", maxRedirectNumberConfig, e.getCause());
System.err.println("Error parsing http.max_redirect_number config: " + e.getMessage());
}
maxRedirectNumber = maxRedirectNumberConfig;
}
@@ -116,18 +106,13 @@ public HttpURLConnection makeConnection()
private HttpURLConnection makeConnection(URL requestURL, int movedTimes,
Consumer<HttpURLConnection> beforeConnection) throws IOException, URISyntaxException, ScriptException, NoSuchMethodException {
if (movedTimes > maxRedirectNumber) {
log.warn("Too many redirect " + requestURL);
throw new IOException("Too many redirect " + requestURL);
}

Proxy proxy = new CustomProxySelector(PreferencesData.getMap())
.getProxyFor(requestURL.toURI());
log.debug("Using proxy {}", proxy);
Proxy proxy = new CustomProxySelector(PreferencesData.getMap()).getProxyFor(requestURL.toURI());

final String requestId = UUID.randomUUID().toString()
.toUpperCase().replace("-", "").substring(0, 16);
HttpURLConnection connection = (HttpURLConnection) requestURL
.openConnection(proxy);
final String requestId = UUID.randomUUID().toString().toUpperCase().replace("-", "").substring(0, 16);
HttpURLConnection connection = (HttpURLConnection) requestURL.openConnection(proxy);

// see https://github.com/arduino/Arduino/issues/10264
// Workaround for https://bugs.openjdk.java.net/browse/JDK-8163921
@@ -150,19 +135,11 @@ private HttpURLConnection makeConnection(URL requestURL, int movedTimes,
beforeConnection.accept(connection);

// Connect
log.info("Connect to {}, method={}, request id={}", requestURL, connection.getRequestMethod(), requestId);

connection.connect();
int resp = connection.getResponseCode();
log.info("Request complete URL=\"{}\", method={}, response code={}, request id={}, headers={}",
requestURL, connection.getRequestMethod(), resp, requestId, StringUtils.join(connection.getHeaderFields()));

if (resp == HttpURLConnection.HTTP_MOVED_PERM
|| resp == HttpURLConnection.HTTP_MOVED_TEMP) {

if (resp == HttpURLConnection.HTTP_MOVED_PERM || resp == HttpURLConnection.HTTP_MOVED_TEMP) {
URL newUrl = new URL(connection.getHeaderField("Location"));
log.info("The response code was a 301,302 so try again with the new URL " + newUrl);

return this.makeConnection(newUrl, movedTimes + 1, beforeConnection);
}

1 change: 0 additions & 1 deletion arduino-core/src/processing/app/Platform.java
Original file line number Diff line number Diff line change
@@ -52,7 +52,6 @@
* know if name is proper Java package syntax.)
*/
public class Platform {
// DO NOT USE log4j here otherwise the root path of the logs will no be initialize correctly
/**
* Set the default L & F. While I enjoy the bounty of the sixteen possible
* exception types that this UIManager method might throw, I feel that in
Original file line number Diff line number Diff line change
@@ -32,8 +32,6 @@
import cc.arduino.utils.network.HttpConnectionManager;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import processing.app.BaseNoGui;
import processing.app.I18n;
import processing.app.debug.TargetBoard;
@@ -48,7 +46,6 @@
import static processing.app.I18n.tr;

public class BoardCloudResolver {
private static Logger log = LogManager.getLogger(BoardCloudResolver.class);

public synchronized void getBoardBy(String vid, String pid) {
// this method is less useful in Windows < WIN10 since you need drivers to be already installed
@@ -61,12 +58,10 @@ public synchronized void getBoardBy(String vid, String pid) {
.makeConnection();
int code = httpConnection.getResponseCode();
if (code == 404) {
log.warn("Fail to get the Vid Pid information from the builder response code={}", code);
return;
}
InputStream is = httpConnection.getInputStream();
BoardCloudAPIid board = mapper.readValue(is, BoardCloudAPIid.class);
log.info("Board info from the cloud {}", board);
// Launch a popup with a link to boardmanager#board.getName()
// replace spaces with &
String realBoardName = board.getName().replaceAll("\\(.*?\\)", "").trim();
@@ -76,8 +71,6 @@ public synchronized void getBoardBy(String vid, String pid) {
} catch (Exception e) {
// No connection no problem, fail silently
//e.printStackTrace();
log.warn("Error during get board information by vid, pid", e);

}
}

2 changes: 0 additions & 2 deletions build/windows/launcher/config.xml
Original file line number Diff line number Diff line change
@@ -43,8 +43,6 @@
<cp>%EXEDIR%/lib/java-semver-0.8.0.jar</cp>
<cp>%EXEDIR%/lib/jmdns-3.5.5.jar</cp>
<cp>%EXEDIR%/lib/jtouchbar-1.0.0.jar</cp>
<cp>%EXEDIR%/lib/log4j-api-2.16.0.jar</cp>
<cp>%EXEDIR%/lib/log4j-core-2.16.0.jar</cp>
<cp>%EXEDIR%/lib/slf4j-simple-1.7.22.jar</cp>
<cp>%EXEDIR%/lib/slf4j-api-1.7.22.jar</cp>
<cp>%EXEDIR%/lib/jna-4.2.2.jar</cp>
2 changes: 0 additions & 2 deletions build/windows/launcher/config_debug.xml
Original file line number Diff line number Diff line change
@@ -43,8 +43,6 @@
<cp>%EXEDIR%/lib/java-semver-0.8.0.jar</cp>
<cp>%EXEDIR%/lib/jmdns-3.5.5.jar</cp>
<cp>%EXEDIR%/lib/jtouchbar-1.0.0.jar</cp>
<cp>%EXEDIR%/lib/log4j-api-2.16.0.jar</cp>
<cp>%EXEDIR%/lib/log4j-core-2.16.0.jar</cp>
<cp>%EXEDIR%/lib/slf4j-simple-1.7.22.jar</cp>
<cp>%EXEDIR%/lib/slf4j-api-1.7.22.jar</cp>
<cp>%EXEDIR%/lib/jna-4.2.2.jar</cp>